我想知道如何加载Appbase和Appdomain之外的程序集。
我的问题是我有一个共享目录上的程序集列表。我的应用程序需要加载这些程序集,这些程序集位于Appbase中指定的路径之外(可执行文件的路径)。我不想将它们移动到Appbase文件夹中。
有关更多信息,我有一个在分布式域中运行的应用程序来测试程序集集合。应用程序启动时,它从数组加载这些程序集。当我在本地桌面上测试此应用程序时,它运行良好(加载并从程序集中进行反射等),但是从群集计算机中,它无法加载那些相同的程序集,并抛出以下异常:
FileNotFoundException异常。无法加载文件或程序集或其依赖项之一。系统找不到指定的文件。
答案 0 :(得分:2)
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中指定的目录必须是应用程序基本目录的子目录。