2010-07-05 120 views
0

我有一個項目(MyProject的),其中包含從引用的程序集的早期綁定對象的一段代碼(我們將CommonAssembly稱呼它):鑄造早期綁定對象類型到後期綁定的對象類型

Dim myObject As CommonAssembly.MyEarlyBoundType 

現在我有一個動態加載另一個程序集,因爲它不存在於所有的項目:

Dim myLateBoundObject As Object = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("Utils", "Utils.MyLateBoundType") 

MyLateBoundType從CommonAssembly.MyEarlyBoundType派生,而我要投給myObject的myLateBoundObject,然後以編程調用額外的成員方法 通過反射。 我曾經想過,通過提取myLateBoundOject的類型並將myObject轉換爲myLateBoundObject,它可以工作,但CType()和DirectCast()方法都不會接受提取的類型,並引用「Keyword does not named a type 「錯誤:

myLateBoundObject = DirectCast(myObject, GetType(myLateBoundObject)) 

我不完全知道爲什麼一個動態加載的類型不能對DirectCast使用方法,因爲如果Utils.MyLateBoundType在引用(敢肯定它不是類型的安全檢查?)‘MyPrjoect’ ,我可以執行:

myLateBoundObject = DirectCast(myObject, Utils.MyLateBoundType) 

沒有任何問題 - 但這不是一個動態的解決方案。

有什麼建議嗎?

乾杯,

百勝餐飲。

回答

0

是的,這不會像那樣工作。您在代碼中進行的任何嘗試轉換爲動態加載類型的嘗試都會使程序對程序集具有非動態依賴關係。

您應該使用接口類型。在一個單獨的程序集中聲明該類型,以及您希望在主程序中可用的所有屬性和方法。你的主程序和你的插件都會依賴它。動態類型應該繼承它以提供實現。現在可以將CreateInstance的返回值轉換爲該接口類型。

+0

是的,這似乎很多tider的方式去了解它。乾杯! – Yumbelie 2010-07-05 13:49:15