2013-07-22 132 views
0

我想創建一個對象的實例,如果我可以幫助它,我可以在我的課程的其他地方使用它,而無需經過更多的反射。從調用的對象調用方法

創建對象後(通過activator或constructorInfo,我已經閱讀了兩個參數,但使用激活因爲其較短的例子)我必須投它,但這是行不通的。

例如:

Server instance; 

public void A() 
{ 
    Assembly loaded = Assembly.LoadFrom("C:\Program Files\test2\Shared.dll"); 
    serverType = loaded.GetType("Server"); 
    object obj = Activator.CreateInstance(serverType, new [] { "test" }); 
    instance = (Server)obj; 
} 

public void B() 
{ 
    instance.startServer(); 
} 

這給出了一個例外:

System.InvalidCastException: [A]Server cannot be cast to [B]Server. 
    Type A originates from 'Shared, Version=0.0.0.0, Culture=neutral,  
    PublicKeyToken=2a032d22a4688508' in the context 
    'LoadFrom' at location 'C:\Program Files\test1\Shared.dll'. 
    Type B originates from 'Shared, Version=0.0.0.0, Culture=neutral, 
    PublicKeyToken=2a032d22a4688508' in the context 'Default' at location . 
    'C:\Program Files\test2\Shared.dll' 

我瞭解拋出的異常的原因,但有沒有辦法投實例作爲從服務器我想要的類型,即動態加載的DLL?

+0

您的代碼中的「服務器」與「test.dll」中的「服務器」不同嗎?或兩者指向相同的類型? –

+0

對不起,我試圖縮短代碼,已編輯刪除test.dll,現在試圖從正確的位置加載 – user1584120

+0

我認爲你不明白我的問題。您的代碼中的服務器與Shared.dll中的「服務器」不同?或兩者指向相同的類型? –

回答

0

在此行上:instance = (Server)obj;您需要指定類型服務器的完全限定名稱。

在程序集中運行此代碼,可能會出現另一種類型Server,因此編譯器試圖通過選擇本地代碼來解決此歧義。您需要指定,您要將其轉換爲Server類的test.dll程序集或任何其他特定程序,例如:NAMESPACE.TYPE_NAME

+0

在我的情況下,它們具有相同的名稱空間,因爲它們實際上是完全相同的類,並且在完全相同的程序集中,只是在不同的位置。我需要在其他位置使用dll,因爲我使用程序集的路徑來獲取啓動另一個exe的路徑。 – user1584120

+0

這是什麼「不同的位置」代表? – Tigran

+0

我的意思是相同的DLL在兩個不同的位置。我爲另一個應用程序創建了一些插件,它們共享一些程序集。 – user1584120