C# 如何动态引用查找其他程序集的程序集?
为这个狡猾的问题道歉-如果有人有更好的建议,很乐意重新措辞 我试图通过动态调用属于另一个应用程序的程序集来创建对象 以下PowerShell代码对我来说运行良好:C# 如何动态引用查找其他程序集的程序集?,c#,powershell,reflection,assembly-resolution,C#,Powershell,Reflection,Assembly Resolution,为这个狡猾的问题道歉-如果有人有更好的建议,很乐意重新措辞 我试图通过动态调用属于另一个应用程序的程序集来创建对象 以下PowerShell代码对我来说运行良好: [Reflection.Assembly]::LoadFrom("C:\Program Files\Vendor\Product\ProductAPI.dll") $bobject = new-object ProductAPI.BasicObject $bobject.AddName("Some Name") 我正努力在
[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
{“无法加载文件或程序集”“另一个对象,版本=1.2.345.0,区域性=中性,PublicKeyToken=null”“或其依赖项之一。系统找不到指定的文件。”
BasicObject构造函数似乎正在尝试调用另一个对象(来自同一文件夹中的AnotherObject.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);
};
我认为您正在加载的DLL需要另一个DLL才能工作。您可以使用此工具探索DLL的依赖关系。当您找到丢失的DLL时,请将其复制到发布文件夹或修改windows路径以包含它。值得使用(程序集绑定日志查看器)检查无法加载的内容这将向您显示无法加载的内容(以及.NET加载程序正在查找的位置)。@MathewFoscarini.NET程序集加载程序不直接使用路径(现在本机dll加载程序使用:或至少不直接使用)最好考虑一下。特别是通过<代码> LoadFrom < /代码>加载的程序集的位置包括加载任何依赖项。参见我以前的评论:首先要做的是知道什么是找不到的。谢谢各位,看起来我没有意识到可执行文件几乎需要和Applica在同一个文件夹中。我想和你一起工作。