如何在appbase外部加载程序集(更多信息)

本文关键字:信息 程序集 加载 appbase 外部 | 更新日期: 2023-09-27 18:02:24

我想知道如何加载Appbase和Appdomain之外的程序集。

我的问题是我有一个共享目录上的程序集列表。我的应用程序需要加载这些程序集,它们位于Appbase中指定的路径(可执行文件的路径)之外。我不想把它们移到Appbase文件夹。

有关更多信息,我有一个在分布式域中运行的应用程序,用于测试程序集的集合。当应用程序启动时,它从数组加载这些程序集。当我在本地桌面上测试这个应用程序时,它工作得很好(从程序集加载和反射等),但是从群集计算机上,它无法加载这些相同的程序集,并抛出以下异常:

FileNotFoundException。无法加载文件或程序集或其依赖项之一。系统找不到指定的文件

如何在appbase外部加载程序集(更多信息)

如果找不到程序集或其引用之一,则触发一个事件:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
        }

在加载程序集之前添加它。在其中放置一个断点,在args中应该有一些关于您缺少的程序集的信息

MSDN -程序集加载文件

string filePath = "C:'asmPath";
Assembly myAssembly = Assembly.LoadFile(filePath);

你也可以在app.config中定义一个探测路径(我认为这是一个更好的解决方案),并让CLR根据需要加载程序集。MSDN探测路径

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2'subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

迟到7年半。你不能https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/specify-assembly-location

privatePath中指定的目录必须是应用程序基目录的子目录。

感谢@hcb的指导,我终于解决了这个问题:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name.Contains("Dll2Find"))
    {
        try
        {
            return Assembly.LoadFrom(@"D:'findHere'Dll2Find.dll");
        }
        catch (Exception)
        {
            return null;
        }
    }
    return null;
}