如何动态引用查找另一个程序集的程序集
本文关键字:程序集 查找 另一个 引用 何动态 动态 | 更新日期: 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(,但找不到它。
关于如何解决这个问题的任何提示?
如果在常用位置找不到依赖程序集,则需要手动指定如何查找它们。
我知道的两种最简单的方法:
-
提前手动加载依赖程序集组装.加载。
-
处理正在加载具有其他程序集依赖项的程序集。
两者本质上都要求您提前知道您尝试加载的程序集的依赖项,但我认为这不是一个大问题。
如果您选择第一个选项,那么研究全负载和仅反射负载之间的区别也是值得的。
如果你更愿意使用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);
};