C# 如何在appbase外部加载程序集(详细信息)

C# 如何在appbase外部加载程序集(详细信息),c#,.net,C#,.net,我想知道如何加载Appbase和Appdomain之外的程序集 我的问题是,我有一个共享目录上的程序集列表。我的应用程序需要加载这些程序集,这些程序集位于Appbase中指定的路径(可执行文件的路径)之外。我不想将它们移动到Appbase文件夹中 有关更多信息,我有一个在分布式域中运行的应用程序,用于测试程序集集合。当应用程序启动时,它从数组加载这些程序集。当我在本地桌面上测试此应用程序时,它运行良好(从程序集加载并进行反射等),但在群集计算机上,它无法加载相同的程序集,并引发以下异常: Fil

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

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

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

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

那怎么办

您还可以在App.CONFIG中定义一个探测路径(我认为这是一个更好的解决方案),并让CLR按需加载程序集。


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

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

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {

        }

在加载程序集之前添加它。在其中放置一个断点,并且在args中应该有一些关于您丢失的程序集的信息,这些信息是7年半后丢失的。你不能

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;
}

如果您提供一些关于为什么要加载这些程序集的信息,可能会有所帮助。它们是否包含插件,或者是在编译时引用的?有关更多信息,我有一个在分布式域中运行的应用程序,该应用程序的目标是:测试一组程序集测试。当应用程序启动时,它从不在应用程序同一位置的程序集路径数组加载程序集,当我在本地桌面上测试此应用程序时:它运行良好(从程序集加载并进行反射等),但从群集计算机,它无法加载程序集(FileNotFoundException.com无法加载文件或程序集或其依赖项之一。系统找不到指定的文件)。可以,但这些目录“bin;bin2\subin;bin3”必须位于示例中的“c:\asmPath”下。在我的示例中,我的应用程序位于“c:\application\application.exe”中,程序集位于“\\servernamexample\assemblies”中:这就是问题所在。
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {

        }
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;
}