Невозможно создать объект в другом домене приложения при вызове C# с использованием C++
Я создал код C# с типом вывода в качестве сетевого модуля. Это используется в коде C++.
Я хочу создать объект той же сборки, который уже загружен. Но в отдельном домене приложений. Но при этом я не могу загрузить сборку для создания объекта с помощью метода CreateInstance AndUnwrap. При попытке сделать то же самое с использованием автономного кода 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 и нашел его как имя библиотеки DLL, которая скомпилирована из кода C++. При попытке из автономного C# это было имя exe.
Это правильный способ создания AppDomain при совместном использовании C++ и C#? Или я сделал какую-то ошибку при создании домена приложения. Пожалуйста помогите.
1 ответ
Наконец-то все заработало. Может быть, это не сработало, так как я использую C++ управляемую DLL.
Но даже когда я вручную ввел местоположение DLL и загрузил с помощью CreateInstanceFromAndUnwrap, это тоже не сработало. Но когда не удается разрешить сборку, запускается событие AssemblyResolve. Я использую ту же сборку, которая выполняется для создания нового домена приложений. Вот код
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
return Assembly.GetExecutingAssembly();
}
Когда не удается загрузить, он возвращает текущую сборку и работает нормально.