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.dllAddon.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:如何加载依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

Erlang,如何加载应用程序及其依赖项

如何将 pom 中的依赖项加载到 eclipse 项目的类路径中?

如何诊断 dnx 中缺少的依赖项(或其他加载程序故障)?

webpack加载AMD模块而不捆绑

如何安装 react-mgtEvents 的依赖项

从 GitHub 加载 Maven 依赖项 [重复]