我创建了一个输出类型为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时犯了任何错误。请协助。
答案 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();
}
无法加载时,它返回当前的程序集并正常工作。