記得在以前的博客里就提到過probing的privatePath屬性可以定義當前AppDomain搜索程序集文件的目錄。比如當前應用程序使用A.dll,但是A.dll並沒有直接存放在AppDomain的根目錄下,而是存儲於子目錄。在應用程序配置文件中添加probing privatePath可以解決這個問題。看一個配置簡單示例:
<runtime> <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1″> <probing privatePath=”Bin2″ /> </assemblyBinding> </runtime>
privatePath只可以是相對路徑,並以’;'符號分隔。如果為絕對路徑則無法加載。Unity本身是無法實現不同物理存儲模塊的加載,被注冊類型必須存在於當前的AppDomain中,否則內部調用Type.GetType函數會拋出異常。對於一個Plugin容器,它的Plugins會存放在分類目錄中便於管理。如果你並不想為每一個Plugin隔離加載或者多個Plugin存儲在完全不同的目錄下,那么可以考慮還是用Unity吧。在你的應用程序配置文件中添加多個probing privatePath就可以。看一個簡單的示例:
ComponentModel是一個程序集,它定義了一個IAction接口:
1 namespace ComponentModel 2 { 3 public interface IAction 4 { 5 void DoWork(); 6 } 7 }
ClassLibrary1是一個插件程序集,Action1實現了ComponentModel的IAction接口。
1 using ComponentModel; 2 3 namespace ClassLibrary1 4 { 5 public sealed class Action1 : IAction 6 { 7 #region IAction Members 8 9 public void DoWork() 10 { 11 12 } 13 14 #endregion 15 } 16 }
UnityTest8是一個插件容器,它的配置文件如下:
<?xml version=”1.0″ encoding=”utf-8″ ?> <configuration> <configSections> <section name=”unity” type=”Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration”/> </configSections> <unity xmlns=”http://schemas.microsoft.com/practices/2010/unity”> <assembly name=”ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null” /> <assembly name=”ComponentModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null” /> <container> <register type=”ComponentModel.IAction” mapTo=”ClassLibrary1.Action1″ /> </container> </unity> <runtime> <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1″> <probing privatePath=”Plugins\Plugin1″ /> </assemblyBinding> </runtime> </configuration>
當前AppDomain根目錄下有一個子目錄Plugins\Plugin1存放了IAction的實現ClassLibrary1.dll。現在通過Unity創建IAction的實現:
1 IUnityContainer unityContainer = new UnityContainer(); 2 unityContainer.LoadConfiguration(); 3 4 IAction action = unityContainer.Resolve<IAction>();