如何在appbase外部加载程序集(更多信息)
本文关键字:信息 程序集 加载 appbase 外部 | 更新日期: 2023-09-27 18:02:24
我想知道如何加载Appbase和Appdomain之外的程序集。
我的问题是我有一个共享目录上的程序集列表。我的应用程序需要加载这些程序集,它们位于Appbase中指定的路径(可执行文件的路径)之外。我不想把它们移到Appbase文件夹。
有关更多信息,我有一个在分布式域中运行的应用程序,用于测试程序集的集合。当应用程序启动时,它从数组加载这些程序集。当我在本地桌面上测试这个应用程序时,它工作得很好(从程序集加载和反射等),但是从群集计算机上,它无法加载这些相同的程序集,并抛出以下异常:
FileNotFoundException。无法加载文件或程序集或其依赖项之一。系统找不到指定的文件
如果找不到程序集或其引用之一,则触发一个事件:
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;
}