Невозможно создать объект в другом домене приложения при вызове C # с использованием переполнения стека

Я создал код 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 #? Или я сделал какую-то ошибку при создании домена приложения. Пожалуйста помогите.

0

Решение

Наконец-то все заработало. Может быть, это не сработало, так как я использую C ++ управляемую DLL.

Но даже когда я вручную ввел местоположение DLL и загрузил с помощью CreateInstanceFromAndUnwrap, это тоже не сработало. Но когда не удается разрешить сборку, запускается событие AssemblyResolve. Я использую ту же сборку, которая выполняется для создания нового домена приложений. Вот код

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

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

Когда не удается загрузить, он возвращает текущую сборку и работает нормально.

0

Другие решения