Невозможно создать объект в другом домене приложения при вызове 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();
        }

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

Другие вопросы по тегам