在新的 appdomain 中加载 C 模块失败

Posted

技术标签:

【中文标题】在新的 appdomain 中加载 C 模块失败【英文标题】:Failed to load C module in new appdomain 【发布时间】:2013-11-21 03:28:43 【问题描述】:

我有一些 .NET 代码需要在单独的 AppDomain 中运行,除了调用 COM 组件外,一切都很顺利。 为了清楚起见,我写了一个非常简单的repro,如下所示:

AppDomain ap = AppDomain.CreateDomain("newap");
ap.DoCallBack(
    () =>
    
        //GroupPolicyObject is from assembly microsoft.grouppolicy.management.interop.dll
        GroupPolicyObject newGPO = new GroupPolicyObject();
    );

例外:

System.TypeInitializationException:类型初始化器 '' 抛出异常。 ---> .ModuleLoadException:C++ 模块失败 在尝试初始化默认 appdomain 时加载。 ---> System.Runtime.InteropServices.COMException:无效操作。 (来自 HRESULT 的异常:0x80131022)在 System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 错误代码,IntPtr 错误信息)在 .GetDefaultDomain() 在 .DoCallBackInDefaultDomain(IntPtr 函数, 无效* cookie) 在 .LanguageSupport._Initialize(LanguageSupport* ) 在 .LanguageSupport.Initialize(LanguageSupport* ) --- 内部异常堆栈跟踪结束 --- at .ThrowModuleLoadException(字符串 错误消息,异常内部异常)在 .LanguageSupport.Initialize(LanguageSupport* ) 在 .cctor()

代码可以传入默认域,应该不是.NET框架版本的问题。

我在互联网上进行了很多搜索,但没有任何有用的解决方案。有谁知道问题是什么以及如何实现这一目标?

【问题讨论】:

仅仅因为它在默认的 AppDomain 中工作并不意味着它不是由于 .NET Framework 版本。尝试创建一个独立的复制器,并尝试 .NET 2.0 和 4.0。 是的,我都试过了,但是结果一样。 【参考方案1】:

最后我通过添加修复它

  <startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>

在配置文件中。

link 非常有用。

【讨论】:

以上是关于在新的 appdomain 中加载 C 模块失败的主要内容,如果未能解决你的问题,请参考以下文章

无法在新的 appDomain 中加载程序集

ApplicationManager.CreateObject 无法在新的 AppDomain 中加载程序集

在新的 Appdomain 中加载程序集,需要完全信任父程序集

在不同的 AppDomain 中加载具有依赖项的程序集

C# 在 appdomain 调用方法中加载 dll,而不会再次加载 dll

在 AppDomain 问题中加载具有依赖项的程序集