0

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

4

1 回答 1

0

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

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

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

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

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

于 2015-02-09T02:00:35.997 回答