C# 如何动态引用查找其他程序集的程序集?

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") 我正努力在

为这个狡猾的问题道歉-如果有人有更好的建议,很乐意重新措辞

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

以下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

{“无法加载文件或程序集”“另一个对象,版本=1.2.345.0,区域性=中性,PublicKeyToken=null”“或其依赖项之一。系统找不到指定的文件。”

BasicObject构造函数似乎正在尝试调用另一个对象(来自同一文件夹中的AnotherObject.dll),但找不到它


有关如何解决此问题的任何提示?

如果在中找不到依赖程序集,则需要手动指定如何查找它们

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

  • 提前使用手动加载从属部件

  • 为正在加载的域处理AssemblyResolve事件 具有附加程序集依赖项的程序集

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

    如果您选择第一个选项,那么也值得研究满载和满载之间的区别

    如果您愿意使用(我建议),您可以尝试这样的方法,它具有使用嵌套依赖关系链的额外好处(例如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);
    };
    

    我认为您正在加载的DLL需要另一个DLL才能工作。您可以使用此工具探索DLL的依赖关系。当您找到丢失的DLL时,请将其复制到发布文件夹或修改windows路径以包含它。值得使用(程序集绑定日志查看器)检查无法加载的内容这将向您显示无法加载的内容(以及.NET加载程序正在查找的位置)。@MathewFoscarini.NET程序集加载程序不直接使用路径(现在本机dll加载程序使用:或至少不直接使用)最好考虑一下。特别是通过<代码> LoadFrom < /代码>加载的程序集的位置包括加载任何依赖项。参见我以前的评论:首先要做的是知道什么是找不到的。谢谢各位,看起来我没有意识到可执行文件几乎需要和Applica在同一个文件夹中。我想和你一起工作。