【问题标题】:Reflection.Net: how to load dependencies?Reflection.Net:如何加载依赖项?
【发布时间】: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");

不要改变任何东西。

【问题讨论】:

    标签: c# reflection dependencies add-on


    【解决方案1】:

    几个选项:

    1. 您可以附加到 AppDomain.AssemblyResolve 以帮助 CLR 解析程序集。
    2. 您可以考虑将加载项隔离到它们自己的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 一起使用。

          谢谢大家。

          【讨论】:

            猜你喜欢
            • 2021-06-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-25
            • 1970-01-01
            • 2017-08-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多