2010-06-19 73 views
1

解決依賴程序集的引用我有它運行就像一個調度程序Windows服務,它擴展了可通過其他類實現成爲插件此服務的接口。所有插件(例如Plugin1,Plugin2 ...)將分別放置在PlugIn的子文件夾中,例如PlugIn \ Plugin1,PlugIn \ Plugin2。在運行時,將搜索每個子文件夾(Plugin1,Plugin2)以查找實現該接口的任何程序集,並使用相應的dlls方法計劃一個計時器。Windows服務就像一個調度服務運行,不能在運行時

現在萬一Plugin1 & Plugin2共享common.dll(私有程序集),調度程序只加載一次(以先發生者爲準)。如果由於某些商業原因,我們更新common.dll for Plugin1並將它複製到Plugin1文件夾中,使Plugin2保留以前的版本,這成爲一個問題,因爲現在common.dll將被加載非確定性。

有沒有一種方法可以在計劃或更高版本時將計算機的二進制文件集(從相應的文件夾中)與計時器綁定?

回答

3

聽起來對我來說,這裏要做的是爲每個插件/實現創建AppDomain,並將每個插件文件夾用作bin路徑。這樣,每個插件都可以使用自己的完全隔離組件。

另一種(甚至是更孤立的)方法是爲每個呼叫創建Process;這可能非常有效,並且比處理AppDomain s更簡單。

關於使用AppDomain s鏈接from here(請參閱下表),有大量的信息。

+0

我已經通過Appdomain路線,但無法限制加載的DLL。我想利用流程,但無法想出一種方法來實現這種情況,在這種情況下,服務代碼會在每次從自己的合格DLL中反省並安排一種方法時創建一個新流程。 – rockvista 2010-06-19 07:39:02

+0

在運行時實現這種方式(每個插件是主機服務下的一個新進程)之後,來自主機位置的公共/共享dll將在每個生命週期中加載一次,而不是從每個插件的相應插件位置加載一次,在。 任何可能有缺陷/我應該考慮在我的實施? – rockvista 2010-07-09 08:16:23

+0

@rockvista - 也許'AppDomainSetup'的'PrivateBinPath'等? – 2010-07-09 08:24:16

0

一個簡單的解決方案是使用ILMerge將插件的所有程序集合併到一個程序集中。這應該照顧它。

+0

我已經試過這個沒有運氣,基本上它在設計時創建了一個複合庫/ exe文件,它在運行時被CLR爆炸並帶來相同的問題。 基本上,通過ILMerge的快速概述,它似乎是一個整理二進制文件的ZIP工具。 – rockvista 2010-06-19 08:49:34