在C#中Web应用程序一般是由IIS启动管理的,所以我们可以通过判断是否存在应用程序的入口程序集来确定当前应用程序是否是Web应用程序:
bool isWeb = Assembly.GetEntryAssembly() == null;
C#开发指南
在C#中Web应用程序一般是由IIS启动管理的,所以我们可以通过判断是否存在应用程序的入口程序集来确定当前应用程序是否是Web应用程序:
bool isWeb = Assembly.GetEntryAssembly() == null;
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!--配置log4net解析--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <connectionStrings> <!--配置log4net写入Sqlite数据库的连接字符串--> <add name="sqlite" connectionString="Data Source=|DataDirectory|log4net.db;Version=3;Compress=True;UTF8Encoding=True;" /> </connectionStrings> <log4net> <!--配置输出到跟踪中--> <appender name="trace" type="log4net.Appender.TraceAppender, log4net"> <!--配置日志输出格式--> <layout type="log4net.Layout.PatternLayout, log4net" value="[%d][%t][%p][%c]%m%n%exception" /> </appender> <!--配置输出到文件中--> <appender name="file" type="log4net.Appender.RollingFileAppender, log4net"> <!--配置日志文件--> <file value="logs/log4net.txt" /> <!--配置日志文件存时,继续添加日志--> <appendToFile value="true" /> <!--配置日志文件名以时间格式创建--> <rollingStyle value="Date" /> <!--配置日志文件名的时间格式--> <datePattern value="yyyyMMddHHmmss" /> <!--配置日志输出格式--> <layout type="log4net.Layout.PatternLayout, log4net" value="[%d][%t][%p][%c]%m%n%exception" /> </appender> <!--配置输出到控制台中--> <appender name="console" type="log4net.Appender.ColoredConsoleAppender, log4net"> <!--配置日志输出格式--> <layout type="log4net.Layout.PatternLayout, log4net" value="[%d][%t][%p][%c]%m%n%exception" /> </appender> <!--配置输出到数据库中--> <appender name="database" type="log4net.Appender.AdoNetAppender, log4net"> <!--日志缓存,当日志数达到设置数时执行写入数据库--> <bufferSize value="1" /> <!--配置数据库连接字符串--> <connectionStringName value="sqlite" /> <!--配置数据库连接对象类型--> <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite" /> <!--配置数据库insert语句--> <commandText value="insert into T_Log4Net (C_Date, C_Thread, C_Level, C_Logger, C_Message) values (@date, @thread, @level, @logger, @message)" /> <!--配置数据库insert语句参数--> <parameter> <parameterName value="@date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout, log4net" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout, log4net" value="%t" /> </parameter> <parameter> <parameterName value="@level" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout, log4net" value="%p" /> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout, log4net" value="%c" /> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout, log4net" value="%m" /> </parameter> </appender> <root> <!--输出所有日志级别--> <level value="ALL" /> <!--输出跟踪日志--> <appender-ref ref="trace" /> <!--输出文件日志--> <appender-ref ref="file" /> <!--输出控制台日志--> <appender-ref ref="console" /> <!--输出数据库日志--> <appender-ref ref="database" /> </root> </log4net> </configuration>
最近在使用“Assembly.LoadFile(string path)”加载程序集文件时发现无法正常释放资源,文件一直被占用,一定要关闭主调程序后才能解除文件占用。
经测试,可以改用“Assembly.Load(byte[] rawAssembly)”方法加载程序集,这样就不占用程序集文件了。
byte[] rawAssembly = File.ReadAllBytes(path); Assembly assembly = Assembly.Load(rawAssembly);
一、根据Win32 API定义控制台分离函数:
/// <summary> /// 分离与调用进程相关联的控制台 /// </summary> /// <returns>返回分离是否成功</returns> [DllImport("kernel32.dll")] public static extern bool FreeConsole();
二、分离并关闭控制台窗口:
调用函数“FreeConsole”后,程序进程就可以将其自身从其控制台分离,而如果当前控制台没有其他进程与之链接时,该控制台窗口就会被关闭。当然在进程调用FreeConsole函数之后,它仍旧可以调用Win32 API中的AllocConsole函数来创建一个新的控制台或AttachConsole函数来附加到另一个控制台。
一、根据Win32 API定义窗口相关函数:
/// <summary> /// 查找窗口句柄 /// </summary> /// <param name="lpClassName">类名</param> /// <param name="lpWindowName">窗口名</param> /// <returns>返回查找到的窗口句柄</returns> [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); /// <summary> /// 显示或隐藏窗口 /// </summary> /// <param name="hWnd">窗口句柄</param> /// <param name="nCmdShow">0为隐藏,1为显示</param> /// <returns>返回显示或隐藏是否成功</returns> [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
二、设置控制台窗口的显示或隐藏:
/// <summary> /// 设置控制台窗口是否显示 /// </summary> /// <param name="visible">是否显示</param> public static void SetConsoleWindowVisible(bool visible) { // 查找控制台窗口句柄 IntPtr hWnd = FindWindow(null, Console.Title); // 判断是否找到控制台窗口句柄 if (hWnd != IntPtr.Zero) { // 设置控制台窗口显示或隐藏 if (visible) { ShowWindow(hWnd, 1); } else { ShowWindow(hWnd, 0); } } }