如何加载依赖程序集

本文关键字:依赖 程序集 加载 何加载 | 更新日期: 2023-09-27 17:59:14

我有一个项目处理器,它依赖于其他两个项目。

当我编译项目时,我在Bin文件夹中得到了dll Processor.dll和其他项目的依赖dllProcessor.dll BusinessAction.dll和Repository.dll。

我尝试通过启动类型ProcessRequest类从Processor.dll调用方法。

像这个

 Assembly processorAssembly = Assembly.LoadFile(path + "Processor.DLL"));
        Type myType= processorAssembly.GetType("Namespace.ProcessRequest");
        myType.InvokeMember("Process", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, submitOfferType, new object[] { 12345 });

Process方法有一些逻辑来处理并将其保存到数据库中。

当我使用InvokeMember()调用processe方法时

我得到异常无法加载文件或程序集"Namespace.BusinessAction,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"或其依赖项之一。系统找不到指定的文件

我该调用方法吗?

如何加载依赖程序集

Appdomain有一个事件,如果找不到引用就会触发:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

在事件处理程序中,您可以手动搜索程序集:

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string s = @"C:'lib'" + args.Name.Remove(args.Name.IndexOf(',')) + ".dll";
    return Assembly.LoadFile(s);
}

尝试

Assembly processorAssembly = Assembly.LoadFrom(path + "Processor.DLL")); 

这将加载所有支持的DLL

@hcb有正确的答案,在2022年它可以简单地写为:

AppDomain.CurrentDomain.AssemblyResolve += (sdr, ar) => {
    string dllPath = $"C:'lib'{ar.Name.Remove(ar.Name.IndexOf(','))}.dll";
    return Assembly.LoadFile(dllPath);
};

AppDomain.CurrentDomain.AssemblyResolve += (sdr, ar) => { 
    return Assembly.LoadFile($"C:''lib''{ar.Name.Remove(ar.Name.IndexOf(','))}.dll");
};

其中c:'lib'是具有依赖dll 的路径