如何动态引用查找另一个程序集的程序集

本文关键字:程序集 查找 另一个 引用 何动态 动态 | 更新日期: 2023-09-27 18:32:29

为这个狡猾的问题道歉 - 如果有人有更好的建议,很乐意改写。

我正在尝试通过动态调用属于另一个应用程序的程序集来创建对象。

以下PowerShell代码对我来说效果很好:

[Reflection.Assembly]::LoadFrom("C:'Program Files'Vendor'Product'ProductAPI.dll")
$bobject = new-object ProductAPI.BasicObject    
$bobject.AddName("Some Name") 

我正在努力在 C# 中做同样的事情。根据StackOverflow上的其他帖子,我目前有这个:

System.Reflection.Assembly myDllAssembly =
System.Reflection.Assembly.LoadFile("C:''Program Files''Vendor''Product''ProductAPI.dll");
System.Type BasicObjectType = myDllAssembly.GetType("ProductAPI.BasicObject");
var basicObjectInstance = Activator.CreateInstance(BasicObjectType);

最后一行的结果是 TargetInvocationException。

{"无法加载文件或程序集'OtherObject, Version=1.2.345.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。

似乎 BasicObject 构造函数正在尝试调用 OtherObject(来自同一文件夹中的 OtherObject.dll(,但找不到它。

关于如何解决这个问题的任何提示?

如何动态引用查找另一个程序集的程序集

如果在常用位置找不到依赖程序集,则需要手动指定如何查找它们。

我知道的两种最简单的方法:

  1. 提前手动加载依赖程序集组装.加载。

  2. 处理正在加载具有其他程序集依赖项的程序集。

两者本质上都要求您提前知道您尝试加载的程序集的依赖项,但我认为这不是一个大问题。

如果您选择第一个选项,那么研究全负载和仅反射负载之间的区别也是值得的。

如果你更愿意使用2(我推荐(,你可以尝试这样的东西,它有使用嵌套依赖链的额外好处(例如MyLib.dll引用LocalStorage.dll引用Raven.Client.dll引用NewtonSoft.Json.dll(,并且还会给你关于它找不到哪些依赖项的信息:

AppDomain.CurrentDomain.AssemblyResolve += (sender,args) => {
    // Change this to wherever the additional dependencies are located    
    var dllPath = @"C:'Program Files'Vendor'Product'lib";
    var assemblyPath = Path.Combine(dllPath,args.Name.Split(',').First() + ".dll");
    if(!File.Exists(assemblyPath))
       throw new ReflectionTypeLoadException(new[] {args.GetType()},
           new[] {new FileNotFoundException(assemblyPath) });
    return Assembly.LoadFrom(assemblyPath);
};