2010-04-29 46 views
2

我有一個有趣的挑戰,我想知道如果有人在這裏可以給我一些方向。動態調用程序集時出現複雜的API問題

我在寫一個運行在網絡上的.Net窗體表單應用程序,並使用SQL Server來保存和提取數據。

我想提供一個迷你「插件」API,開發人員可以在其中構建自己的程序集並實現特定的接口(IDataManipulate)。這些程序集可以被我的應用程序用來調用接口函數並做一些事情。

我可以使用我的API創建程序集,將文件複製到本地硬盤驅動器中的文件夾,並將我的應用程序配置爲使用Reflection從實現的接口(IDataManipulate.Execute)調用特定函數。


問題:由於應用程序將被安裝在網絡中的多個工作站

,是不可能複製插件DLLS用戶將創建到每個機。

解決方案我想:

解決方案1 ​​
複製API DLL到網絡共享。

問題:
需要AllowPartiallyTrustedCallersAttribute,這需要.Net唱歌,我不能強迫我的用戶。

溶液2(優選的)
序列化的dll對象,將其保存到數據庫中,反序列化和呼叫IDataManipulate.Execute。

問題:
反序列化後,我嘗試將其轉換爲IDataManipulate對象,但返回錯誤查找實際的dll文件。

解決方案3個
保存到數據庫的DLL字節的byte []和每次用戶啓動我的應用程序時重新創建DLL在本地PC上。

問題:
Dll可能有依賴關係,我不知道我是否可以檢測到。


任何建議將不勝感激。

謝謝

回答

1

我已經完成了「解決方案3」之前。我們使用「上次修改時間」的時間戳將DLL文件存儲在數據庫表中。這樣你就可以知道應用程序啓動時是否需要更新本地文件。

您可以撥打電話Assembly.GetReferencedAssemblies以獲取程序集中的依存關係列表。這假設插件DLL不使用反射來動態加載一個隨機程序集,但這應該是可以接受的。

另一種選擇是使用AppDomain.AssemblyResolve事件。這個事件不會在啓動時下載所有的插件DLL,而只會讓你下載實際需要的DLL。

+0

@David,你是否嘗試實施解決方案#2?因爲如果我可以避免在運行時創建DLL,它將是理想的。 – 2010-04-29 16:40:43

+0

如果使用AssemblyResolve事件,則可以返回從任何流對象加載的程序集對象。這將允許您從數據庫加載它,而不必先將其保存到磁盤。 – David 2010-04-29 17:58:29

0

您可以將它們複製到網絡共享中,然後當您的應用程序啓動或者您需要加載插件時,您可以比較日期和本地持有的日期,如果它更新,則將其複製到本地..

相關問題