AppDomain.CreateInstanceAndUnwrap在Windows 2k3上使用STG_E_ABNORMALAPIEXIT引发异常FileLoadException

时间:2012-08-14 11:18:26

标签: c# asp.net reflection

在ASP.NET应用程序中,我试图从存储在bin子文件夹中的不同程序集中执行AppDomain中的方法。我正在创建AppDomain并调用AppDomain.CreateInstanceAndUnwrap。它在我的计算机和Windows Server 2K8上工作正常,但在Windows Server 2k3上引发异常:

  

在System.AppDomain.CreateInstanceAndUnwrap(String assemblyName,   字符串typeName)在System.AppDomain.CreateInstance(String   assemblyName,String typeName)at   System.Activator.CreateInstance(String assemblyName,String typeName)   在System.Activator.CreateInstance(String assemblyName,String   typeName,Boolean ignoreCase,BindingFlags bindingAttr,Binder binder,   Object [] args,CultureInfo culture,Object [] activationAttributes,   证据securityInfo,StackCrawlMark& stackMark)at   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,   证据集合安全,StackCrawlMark& stackMark,布尔   forIntrospection)at   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(的AssemblyName   assemblyRef,Evidence assemblySecurity,StackCrawlMark& stackMark,   Boolean forIntrospection,Boolean suppressSecurityChecks)at   System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName,String   codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,   StackCrawlMark&安培; stackMark,Boolean throwOnFileNotFound,Boolean   forIntrospection,Boolean suppressSecurityChecks)at   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String   codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,   StackCrawlMark&安培; stackMark,Boolean throwOnFileNotFound,Boolean   forIntrospection,Boolean suppressSecurityChecks)

     

System.IO.FileLoadException:无法加载文件或程序集   'MyAssembly'或其依赖项之一。退出API调用   异常。 (HRESULT的例外情况:0x800300FA   (STG_E_ABNORMALAPIEXIT))System.IO.FileLoadException:无法加载   文件或程序集'MyAssembly,Version = 2.23.7.23064,Culture = neutral,   PublicKeyToken = null'或其依赖项之一。退出API调用   异常。 (HRESULT的例外情况:0x800300FA   (STG_E_ABNORMALAPIEXIT))

有人知道为什么吗?

1 个答案:

答案 0 :(得分:0)

我的回答(AppDomain shadow copied file access denied with ASP.NET site running on IIS6): 出现问题的原因是CachePath默认值。如果AppPool在网络服务下运行,则使用DefaultUser临时文件夹位置(我不知道为什么)。但网络服务无权访问该文件夹,这是异常的原因。解决方案是显式设置CachePath。例如,我们可以使用ASP.NET AppPool缓存路径:

var domainInfo = new AppDomainSetup
  {
    CachePath = AppDomain.CurrentDomain.SetupInformation.CachePath
    /* ...*/
  };