2015-02-07 6 views
0

Я создал код C# с типом вывода как netmodule. Это используется в коде C++.Невозможно создать объект в другом appdomain при вызове 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 и нашел его в качестве имени DLL, который составляется из кода C++. При попытке использовать автономный C# это было имя exe.

Является ли это подходящим способом создания AppDomain при использовании C++ и C# вместе? Или я допустил ошибку при создании AppDomain. Пожалуйста помогите.

+0

Вы получили сообщение об ошибке? Если да, скопируйте/вставьте его в свой вопрос. –

+0

@RobertHarvey Я добавил ошибку в комментарии рядом с кодом. –

+0

Это сообщение об ошибке кажется простой проблемой поиска файлов. –

ответ

0

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

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

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

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

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