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