zoukankan      html  css  js  c++  java
  • Unity实现子目录下的Plugins加载

    记得在以前的博客里就提到过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>();
  • 相关阅读:
    新的页面事件的添加
    excel里数字0不显示
    VB6接口、对象比较等
    SQL SERVER服务停止和启动命令行
    如何更改VS2008的字体和大小
    如何部署windows service
    模式应用 - 利用工厂模式制作自己的"小程序测试工厂"
    解决Oracle Temp01.dbf不断变大的问题
    如何配置VS2008让它用外置IIS进行调试
    使用JQuery Autocomplete插件(一)
  • 原文地址:https://www.cnblogs.com/junchu25/p/2633440.html
Copyright © 2011-2022 走看看