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>();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?