在我的情況下有三個組件:Consumer
類,IExposedIface
接口和Exposed
類實現IExposedIface
。 Consumer
和Exposed
都與IExposedIface
靜態鏈接,但Consumer
沒有編譯時參考Exposed
。動態加載程序集:爲什麼此代碼有效?
我想拿出一個方案,該方案將允許Consumer
在運行時加載不同版本的Exposed
(取決於輸入數據 - 假設每個輸入文件攜帶其中Exposed
版本應該被用來處理它的信息) 。爲了實現這一點,我開始研究AppDomains,現在我有一個基本版本的工作。
到目前爲止,在提供IExposedIface
組件到Exposed
組件時,有兩種選擇。
只在
Consumer
有IExposedIface.dll
的斌目錄和處理AppDomain.AssemblyResolve
事件爲AppDomain
中,我創建的Exposed
在
Consumer
有IExposedIface.dll
兩個實例的斌目錄以及每個Exposed.dll
。
現在考慮的是我建立Exposed
反對這種IExposedIface
:
public interface IExposedIface
{
string SaySomething();
}
和我建立Consumer
反對這種IExposedIface
:
public interface IExposedIface
{
string SaySomething();
string SaySomethingDifferent();
}
在第一種情況下,異常
例外:方法'SaySomethingDifferent'類型'Exposed.Exposed'從 程序集'Exposed,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'沒有執行。
在那一刻我打電話appDomain.CreateInstanceAndUnwrap(...)
在新創建的AppDomain 到創建Exposed
實例拋出。
這對我來說很合理。
但在第二種情況下,appDomain.CreateInstanceAndUnwrap(...)
經過得很好,我可以沒有問題調用檢索對象上的'SaySomething()'方法。例外
的方法 'SaySomethingDifferent' 沒有在接口/類型發現 'IExposedIface.IExposedIface,IExposedIface,版本= 2.0.0.0,文化=中性公鑰=空'。
只有當我實際撥打電話號碼爲SaySomethingDifferent()
Consumer
。
我很驚訝,在這第二種情況下,CLR讓我走了這麼遠......有人可以解釋爲什麼這是可能的嗎?