代码之家  ›  专栏  ›  技术社区  ›  Olivier de Rivoyre

反射.NET:如何加载依赖项?

  •  27
  • Olivier de Rivoyre  · 技术社区  · 18 年前

    我尝试使用反射将加载项系统添加到我的Windows.NET应用程序中;但如果存在具有dependencie的加载项,则会失败。

    Addon类必须实现接口“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();
    

    当插件不使用dependencie时,它工作得很好。 但是,如果我的加载项引用并使用另一个保存在磁盘加载项附近的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");
    

    不要改变任何东西。

    5 回复  |  直到 15 年前
        1
  •  40
  •   Andreas Tschager    18 年前

    如果 MyToelsDLL 与位于同一目录中 附加DLL 你只需要打电话 Assembly.LoadFrom 而不是 Assembly.LoadFile 使代码工作。否则,处理 AppDomain.AssemblyResolve 活动是前进的道路。

        2
  •  2
  •   Chris Canal    18 年前

    你研究过使用 Inversion Of Control 集装箱?我将castle windsor与一个外部boo文件结合使用,这样我就可以轻松地扩展应用程序,而无需重新编译或担心提供依赖项。

        3
  •  1
  •   Mark Cidade    18 年前

    您可以使用反射访问私有 Assembly. _GetReferencedAssemblies() .

    尽管如此,方法 能够 在.NET框架的未来版本中有所改变,它似乎不太可能在很大程度上依赖于ASP.NET,尽管他们有可能将其从 mscorlib 到 System.Web 这是我所知道的唯一一个引用方法的程序集。

        4
  •  1
  •   Olivier de Rivoyre    18 年前

    assembly.loadFrom工作得很好,直到我尝试在加载项中使用WebService,我有一个“ 无法将“x”类型的对象强制转换为“x”类型 “例外。

    它很难看,但我将在appdomain.assemblyresolve中使用assembly.loadfile。

    谢谢大家。

        5
  •  1
  •   Tim Cooper    15 年前

    多种选择:

    1. 你可以附加到 AppDomain.AssemblyResolve 以帮助CLR解析程序集。
    2. 您可以将外接程序隔离到自己的外接程序中 AppDomain (见 System.AddIn 命名空间和 this website )