在处理自己的子目录中的插件程序集时,存在一个众所周知的问题:一旦这些程序集尝试从其子目录加载各自的依赖项,它们将无法加载。解决方案是在 AppDomains 中加载插件PrivateBinPath
设置在他们的AppDomainSetup
初始化时的对象。然而,这会导致有关编组/跨 AppDomain 通信的其他困难,特别是如果插件应该提供一些 GUI。
当安全方面的优先级较低时(非关键实用程序应用程序,由于错误插件导致崩溃时不会出现严重问题),我有以下想法:应用程序启动时,应搜索所有插件目录,并创建一个新的插件目录。应创建在其 bin 路径中包含这些目录的 AppDomain。然后,整个应用程序及其 GUI 以及所有插件都在该新 AppDomain 中运行。
在给定的情况下,是否有任何理由避免该解决方案?或者是否有任何原因导致该解决方案甚至不可行?
考虑到您所描述的情况,我不知道与您对第二个域的提案相关的任何问题。但是,您还可以通过在 addins 子目录中搜索并从那里加载程序集来研究处理初始域上的程序集加载失败的可能性Assembly.LoadFrom http://msdn.microsoft.com/en-us/library/1009fa28.aspx.
可能的设置示例,其中FindAssemblyByName
必须执行以搜索所有可能的位置:
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
// ...
}
static Assembly CurrentDomain_AssemblyResolve(
object sender,
ResolveEventArgs e)
{
var assemblyName = new AssemblyName(e.Name);
string assemblyFilePath = FindAssemblyByName(assemblyName);
if (string.IsNullOrEmpty(assemblyFilePath))
return null;
return Assembly.LoadFrom(assemblyFilePath);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)