Unity實現子目錄下的Plugins載入

weixin_34041003發表於2012-08-11

記得在以前的部落格裡就提到過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>();

相關文章