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

时间:2011-07-15 09:25:22

标签: c# .net

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

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

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

  

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

4 个答案:

答案 0 :(得分:2)

MSDN - Assembly Load File

怎么样?
string filePath = "C:\asmPath";
Assembly myAssembly = Assembly.LoadFile(filePath);

您还可以在app.config中定义探测路径(我认为这是更好的解决方案)并让CLR按需加载程序集。 MSDN Probing Path

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

答案 1 :(得分:2)

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

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

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {

        }

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

答案 2 :(得分:1)

由于@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;
}

答案 3 :(得分:0)

晚7 1/2年。您不能https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/specify-assembly-location

  

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