使用C ++调用C#时,无法在另一个appdomain中创建对象

时间:2015-02-07 19:10:36

标签: c# c++ appdomain marshalbyrefobject netmodules

我创建了一个输出类型为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时犯了任何错误。请协助。

1 个答案:

答案 0 :(得分:0)

终于搞定了。可能它没有用,因为我正在使用C ++托管DLL。

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

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

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

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