如何在IIS的DefaultDomain应用域中加载指定目录的C#程序集
解决方案
方案1(优先推荐):无需加载自定义程序集到DefaultDomain
ASP.NET 运行时的所有业务代码默认都执行在你已经配置成功的Web应用域(即名称为/LM/W3SVC/2/ROOT-xxxx的域)中,DefaultDomain是IIS Express宿主进程的根应用域,仅负责加载IIS核心运行组件,正常业务场景完全不需要将自定义业务DLL加载到该域,你已经实现的Web域程序集加载逻辑可以满足全部业务需求。
方案2:修改IIS Express配置实现DefaultDomain探测外部DLL
如果确实需要将DLL加载到DefaultDomain,可通过修改iisexpress.exe的配置文件实现:
- 找到IIS Express安装目录,默认路径为
C:\Program Files\IIS Express\(64位版本)或C:\Program Files (x86)\IIS Express\(32位版本) - 在该目录下手动新建名为
iisexpress.exe.config的配置文件,参考如下配置填入内容:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 若DLL存放在IIS Express安装目录的子目录下,可使用probing配置相对路径 --> <!-- <probing privatePath="自定义子目录名"/> --> <!-- 若DLL存放在任意绝对路径,为每个DLL单独配置codeBase即可 --> <dependentAssembly> <assemblyIdentity name="你的业务DLL程序集名称" culture="neutral" /> <codeBase version="1.0.0.0" href="file:///C:/users/Dlls/你的DLL文件名.dll" /> </dependentAssembly> <!-- 有多个DLL可复制多份dependentAssembly节点配置 --> </assemblyBinding> </runtime> </configuration>
方案3:手动为DefaultDomain注册程序集解析器
你之前只给Web应用域注册了程序集解析器,没有给DefaultDomain注册才会导致加载失败,可通过你已经实现的GetAppDomain方法拿到DefaultDomain实例后注册解析事件:
AppDomain defaultDomain = GetAppDomain("DefaultDomain"); defaultDomain.AssemblyResolve += (sender, args) => { var assemblyName = new AssemblyName(args.Name); string dllFullPath = Path.Combine(@"C:\users\Dlls", assemblyName.Name + ".dll"); if (File.Exists(dllFullPath)) { return Assembly.LoadFrom(dllFullPath); } return null; };
注意事项
- 确保IIS Express的运行身份对
C:\users\Dlls目录拥有读取权限,否则会出现权限不足导致的加载失败 - 如果你的业务DLL是强签名的,需要保证配置文件或解析逻辑中的程序集版本、公钥Token与实际DLL的属性一致
- 生产环境使用IIS时对应的宿主进程为
w3wp.exe,修改配置的逻辑与IIS Express完全一致
内容的提问来源于stack exchange,提问作者rle
相关产品推荐
相关产品推荐

