Reflection.Net:如何加载依赖项?
Posted
技术标签:
【中文标题】Reflection.Net:如何加载依赖项?【英文标题】:Reflection.Net: how to load dependencies? 【发布时间】:2010-09-15 23:08:23 【问题描述】:我尝试使用反射将插件系统添加到我的 Windows.Net 应用程序;但是当有依赖的插件时它会失败。 插件类必须实现一个接口“IAddon”并有一个空的构造函数。 主程序使用反射加载插件:
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\Addon.dll");
Type t = assembly.GetType("Test.MyAddon");
ConstructorInfo ctor = t.GetConstructor(new Type[] );
IAddon addon= (IAddon) ctor.Invoke(new object[] );
addon.StartAddon();
插件不使用依赖时效果很好。 但是,如果我的插件引用并使用保存在磁盘中插件附近的另一个 DLL (C:\Temp\TestAddon\MyTools.dll),它将失败:System.IO.FileNotFoundException: 无法加载文件或程序集“MyTools.dll”或其依赖项之一。
我不想在我的可执行文件附近复制插件 DLL,我该如何告诉 .Net 运行时在“C:\Temp\TestAddon\”中搜索任何依赖项?
注意添加
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");
不要改变任何东西。
【问题讨论】:
【参考方案1】:几个选项:
-
您可以附加到
AppDomain.AssemblyResolve
以帮助 CLR 解析程序集。
您可以考虑将加载项隔离到它们自己的AppDomain
(请参阅System.AddIn
命名空间和this website)。
【讨论】:
【参考方案2】:如果 MyTools.dll 与 Addon.dll 位于同一目录中,您只需调用 Assembly.LoadFrom
而不是 Assembly.LoadFile
代码工作。否则,处理AppDomain.AssemblyResolve
事件是可行的方法。
【讨论】:
很遗憾@Andreas 自 2010 年以来就没有出现过,如果我认为你会关心的话,我会给你一个赏金。放飞你这个奥地利小天才。【参考方案3】:您是否考虑过使用Inversion Of Control 容器?我将 Castle Windsor 与外部 Boo 文件一起使用,让我可以轻松扩展应用程序,而无需重新编译或担心提供依赖项
【讨论】:
【参考方案4】:您可以使用反射来访问私有Assembly.
_GetReferencedAssemblies()
。
虽然方法可能在 .NET 框架的未来版本中发生变化,但这似乎不太可能 - ASP.NET 严重依赖它,尽管他们有可能将其从 @ 987654323@ 到 System.Web
这是我所知道的唯一一个引用该方法的程序集。
【讨论】:
【参考方案5】:Assembly.LoadFrom 运行良好,直到我尝试在我的插件中使用 webService,我遇到了“无法将'X'类型的对象转换为'X'类型”异常。 p>
这很难看,但我会将 Assembly.LoadFile 与 AppDomain.AssemblyResolve 一起使用。
谢谢大家。
【讨论】:
以上是关于Reflection.Net:如何加载依赖项?的主要内容,如果未能解决你的问题,请参考以下文章