2010-10-27 87 views
3

所以我實現了一個非常簡單的插件系統。c#插件系統問題

我有以下組件:

MainApp 
IPlugin 
PluginApp 

兩個MainAppPluginApp conatin到IPlugin的參考。現在,在MainApp中,我掃描一個插件文件夾並搜索實現IPlugin界面的東西。

然而,由於使用Type.IsAssignableFrom()IPlugin.dllMainAppPluginApp參考自己的副本,以便它們不被識別爲一個匹配它不工作!

有幫助嗎?

+0

你能解釋一下你的意思(或爲什麼)他們「引用他們自己的IPlugin.dll副本」? – 2010-10-27 19:11:57

+0

你怎麼有不同的'IPlugin.dll? – Oded 2010-10-27 19:12:16

+0

IPlugin.dll包含插件必須實現的接口。所以每個創建插件的人都必須將其包含在他們的項目中。然後,在我的MainApp中,我還必須包含這個。如果我從插件版本中刪除IPlugin.dll,它將正常工作。但是,我無法控制DLL插件創建者包括哪些內容 - 所以我不認爲這是一個好的解決方案(比如,如果有人包含我的應用程序不應該崩潰)。 – 2010-10-27 19:14:28

回答

2

您可以嘗試將定義該插件的代碼放入衛星dll程序集。這樣,你的主代碼和插件都引用相同的類型。


如果插件可以保持它自己的DLL,而不是使用同一個DLL,你會遇到版本問題中的應用。你的主應用程序將如何處理調用不實現相同接口的插件?

當我們在我們自己的軟件中完成這項工作時,我們不得不使用反射方法調用而不是轉換到接口。這不是優雅。


怎麼樣將程序集dll添加到插件目錄中。他們必須在創建應用程序時引用dll,但是在插件實際運行時強制他們使用dll的主程序集版本?

+0

錯誤...我用了錯誤的名詞。衛星組裝實際上用於容納資源。我的意思是一個可以託管接口代碼的組件,但不會被硬編碼到主組件中。 – wllmsaccnt 2010-10-27 19:19:12

+0

我實際上已經在做這個(IPlugin.dll)。我怎樣才能確保插件創建者將使用我的dll?如果有人偶然將自己的dll包含到他們的項目中,我該如何防止我的應用程序崩潰? – 2010-10-27 19:20:31

+0

當您編譯主應用程序時,您將對特定版本屬性設置爲對您的iplugin dll的引用爲true。沒有正確的版本,您的應用程序將無法啓動。插件的dll項目不應該將特定的版本屬性設置爲true。 – wllmsaccnt 2010-10-27 21:54:21