使用 C++ 调用 C# 时无法在另一个应用程序域中创建对象

Posted

技术标签:

【中文标题】使用 C++ 调用 C# 时无法在另一个应用程序域中创建对象【英文标题】:Unable to create object in another appdomain when invoking C# using C++ 【发布时间】:2015-02-07 19:10:35 【问题描述】:

我创建了一个输出类型为 netmodule 的 C# 代码。这是在 C++ 代码中使用的。

我想创建一个已加载的同一个程序集的对象。但是,在一个单独的 AppDomain 中。但是这样做时,我无法加载程序集以使用 CreateInstanceAndUnwrap 方法创建对象。当尝试使用独立的 C# 代码执行相同操作时,它可以正常工作。

C++:

TestClass __gc *testObj;
testObj = AppDomainProcessor::getInstance()->newTestObj((LPWSTR)domName);
//testObj->otherOperation...

C#

namespace TestNS 
public class AppDomainProcessor 
...
public TestClass newTestObj(String domName) 
AppDomain appDomain = AppDomain.CreateDommain(domName);


  TestClass testObj = (TestClass)appDomain.CreateInstanceAndUnwrap(typeof(TestClass).Assembly.FullName,typeof(TestClass).FullName);
//Could not load file or assembly 'MyManaged, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified
    return testObj;
    
...


public class TestClass : MarshalByRefObject 
...


我打印了 AssemblyName,发现它是从 C++ 代码编译的 dll 的名称。从独立 C# 尝试时,它是 exe 的名称。

在同时使用 C++ 和 C# 时,这是创建 AppDomain 的正确方法吗?或者我在创建 AppDomain 时犯了任何错误。请帮忙。

【问题讨论】:

您是否收到错误消息?如果是,请将其复制/粘贴到您的问题中。 @RobertHarvey 我在代码附近的注释中添加了错误。 该错误消息似乎是一个简单的文件查找问题。 好吧,如果它是正确构建的(大如果),那么错误消息说它找不到也包含引发异常的代码的程序集。那是……特别的。首先开始使用 Fuslogvw.exe 收集事实。 *** 程序集活页夹日志条目 (8/2/2015 @ 1:46:39 AM) *** 操作成功。绑定结果:hr = 0x0。操作成功完成。从以下位置加载的程序集管理器:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 在可执行文件 D:\TEST\jre\bin\java.exe 下运行 --- 详细的错误日志如下。 LOG:IJW 显式绑定。文件路径:D:\TEST\lib\native\MyManaged.dll。日志:找不到 IJW 程序集绑定返回的文件。 【参考方案1】:

终于搞定了。可能是因为我使用的是 C++ 托管 DLL,所以它不起作用。

但即使我手动输入 DLL 位置并使用 CreateInstanceFromAndUnwrap 加载,它也不起作用。但是,当 Assembly 解析失败时,它会触发 AssemblyResolve 事件。我正在使用相同的程序集来创建新的 AppDomain。这是代码。

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
            return Assembly.GetExecutingAssembly();
        

当无法加载时,它会返回当前的程序集并正常工作。

【讨论】:

以上是关于使用 C++ 调用 C# 时无法在另一个应用程序域中创建对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

从托管 C# 代码调用非托管 C++ 代码以生成脱机域加入 blob

在 C++ 中使用 C# 代码

如何在另一个应用程序域中设置静态布尔值?

如何在 c++ 中调用 c# 方法?

无法在另一台未安装 VS2017 的机器上运行使用 VS2017 构建的 C++ 应用程序