簡體   English   中英

使用(程序集)引用宿主應用程序的插件

[英]Plugins using a (assembly) reference to the host Application

我正在開發一個我想使用插件擴展的應用程序。

在 SO,我發現了很多關於使用 MEF 的建議,這是一個從目錄加載插件 DLL 的簡單解決方案。 常見的方法是設置插件必須繼承/實現的基本 class 或接口,並將該類/接口包含在庫程序集中,即 PluginBase.dll,應用程序和插件都將引用。

使用這種技術我有兩個問題:

  1. 共享課程

    主應用程序中將有一些類也應該可用於插件。

    顯而易見的解決方案是將它們移動到公共庫程序集中,但我仍然認為在 PluginBase.dll 中有這些類是不正確的,因為它們與插件架構無關。

    我也可以為這些類制作一個單獨的 DLL ,但這意味着第二個 dll 應該在啟動時加載並包含在開發插件中(這不是真正的問題,但我希望新手只添加一個引用)。

  2. 成員可見性

    這是真正的問題:我還在編寫對應用程序有更多控制權的內部插件。

    Since any member of internally-used type would require its class to be moved to PluginBase.dll, I had to inherit a base plugin class in 2 other types (normal and internal plugin) and only put the base and normal classes on PluginBase.dll . 但實際上情況更糟,因為插件可以有或沒有 GUI,所以在一天結束時一切都翻了一番......這太混亂了。

解決方案(是嗎?)

我發現我可以直接在插件項目中添加對主應用程序的引用,這樣做我可以輕松訪問任何 class。 而且,隱藏類/成員只是一個問題或使用內部可見性說明符。 無需實現接口,啟動時無需加載其他程序集,它看起來更快、更簡單、更有效。

我應該注意使用這種方法的副作用嗎?

我這樣做的方式與此相同: http://rickrat.wordpress.com/2011/01/24/using-mef-to-link-view-model-locator-and-load-assembly-uis -動態/在此處輸入圖像描述

應用程序和插件不需要相互了解,它們只需要引用共享的合約程序集。

注意事項:確保您的共享合同 dll 使用公鑰簽名,因為如果 MEF 在插件文件夾(可能是)中找到它,它會嘗試加載它兩次。 擁有一個公鑰,它會根據已經加載的內容對其進行檢查,並且不會再次加載它。

如果您使用的是 WPF,那么您需要看看Prism它是一個不錯的,它可能會幫助您制作基於插件的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM