我有我動態加載的類(使用mef),它們是某種處理程序(這些工作正常)。加載未知類型
這些處理程序可以接收(有一種方法可以接收數據包並返回一個數據包),這些數據包都實現相同的接口(比如IPacket)並返回一個答案(IPacket)。我通過tcp連接接收這些數據包,我的程序不熟悉特定的類(雖然它是一個已知的接口 - IPacket,但是不同的實現)。
所以,當我試圖反序列化一個數據包(把它交給處理程序)時,我得到一個異常。
- 我串行化爲字節的反序列化回對象(使用二進制序列)*
我可以訪問該數據包的實現應該是動態的,唯一的方法,因爲DLL被存儲在文件夾中我可以訪問。
我認爲我可以使用Assembly.LoadFrom來熟悉我的程序和數據包,因爲我甚至不需要安裝它們,只需反序列化(獲取接口的一個實例)並交給處理程序,然後將返回一個答案,我會再次發送。
但它沒有工作..
我認爲我需要找到一種方法,在運行時,然後我的程序會識別它們添加到這些DLL的參考。(我想,也許使用出口(typeof運算()..)對包類要幫忙的,不是嗎?)
嘗試反序列化的是,類名沒有找到時,我得到的例外..
* I編輯了這個話題,我希望它更清楚一點,謝謝=]
- 編輯:
我不是說這是可解的MEF的,我只是雖然它可能是。 這絕對可以用反射來解決。我有一個文件夾,其中包含我希望我的程序在運行時識別的所有類,我只需要在運行時「加載」它們,就好像我已經在同一個文件夾中添加了對dll的引用。
所以基本上我需要做的是:
從文件夾中加載某個接口(IPacket在這個例子中)所有的實現。我不需要實例化它們,但只需將它們作爲變量接收,而不會收到這種類型不在我的項目中的異常。
所以我發現這個片斷:
static constructor() {
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
Assembly ayResult = null;
string sShortAssemblyName = args.Name.Split(',')[0];
Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ayAssembly in ayAssemblies) {
if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0]) {
ayResult = ayAssembly;
break;
}
}
return ayResult;
}
這似乎是接近我所期待的,但我真的不明白這一點。 有沒有辦法中和這個,以便它只加載某個文件夾中的dll? 我的程序會不會熟悉dll?
此外,代碼的解釋將不勝感激。
你正在使用什麼解串器?你有什麼確切的例外? –
我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –
你能多解釋一下嗎?您正在導出該類型,但未由MEF加載或發生了什麼? –