2015-02-07 64 views
0

我已經創建了一個輸出類型爲netmodule的C#代碼。這被用在C++代碼中。無法在使用C++調用C#時在另一個AppDomain中創建對象

我想創建一個已加載的相同程序集的對象。但是,在一個單獨的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,發現它作爲從C++代碼編譯的dll的名稱。從獨立的C#嘗試時,它是exe的名稱。

當使用C++和C#時,這是創建AppDomain的正確方法嗎?或者我在創建AppDomain時犯了一些錯誤。請協助。

+0

您是否收到錯誤消息?如果你是,複製/粘貼到你的問題。 – 2015-02-07 19:16:33

+0

@RobertHarvey我在代碼附近的註釋中添加了錯誤。 – 2015-02-07 19:22:00

+0

該錯誤消息似乎是一個簡單的文件查找問題。 – 2015-02-07 19:30:45

回答

0

終於搞定了。可能是因爲我使用的是C++託管DLL而無法使用。

但即使當我手動輸入DLL位置並使用CreateInstanceFromAndUnwrap加載時,它也不起作用。但是,當Assembly解析失敗時,它會觸發AssemblyResolve事件。我正在使用正在執行的相同程序集來創建新的AppDomain。這是代碼。

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

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

當無法加載時,它返回當前程序集並工作正常。

相關問題