我们正在为我们的插件构建一个 PIP 安装程序。该插件由一个 DLL 中的一个模块组成,我们称之为它MyCoolPlugin.dll
(实际上,这个 DLL 由几个合并的 DLL 组成)。此外,该插件对第三方 DLL 有一些依赖项(例如Infragistics2.Win.UltraWinChart.v10.3.dll
)。
插件安装正常,但插件中嵌入的进程有一个依赖于 UltraWinChart 的 UI。在为这个进程创建 GUI 时,插件会抛出一个关于无法加载的异常,Infragistics2.Win.UltraWinChart.v10.3.dll
即使这个文件与MyCoolPlugin.dll
. 然后出现“此过程没有定义的描述或用户界面”对话框。
如果我们复制到插件中定义Infragistics2.Win.UltraWinChart.v10.3.dll
的目录中,则可以正常工作。看起来正确,但没有对依赖项的引用。清单包含插件目录中每个文件的一个条目,包括.probingPath
petrel.exe.config
plugin.xml
<File>
Infragistics2.Win.UltraWinChart.v10.3.dll
为什么没有正确加载依赖项?
编辑:
对于我们遇到的问题,我想出了一个解决方法。通过在插件初始化(函数)上手动预加载依赖项(通过文件名),Initialize()
我能够确保所有依赖项都被预加载。但是,我不确定这个解决方案是否稳定(我在启动时偶尔会崩溃)。我正在使用的代码是:
Assembly me = Assembly.GetExecutingAssembly();
FileInfo file = new FileInfo(me.Location);
foreach (FileInfo assembly in file.Directory.GetFiles("*.dll"))
{
try
{
Assembly.LoadFile(assembly.FullName);
}
catch (Exception e)
{
CoreLogger.Error(string.Format("Failed to load assembly {0}.", assembly.FullName), e);
}
}
您是否有任何关于如何确保加载插件 .NET 程序集依赖项(外部依赖项,而不是模块依赖项)的详细信息?您是否使用AppDomain.CurrentDomain.AssemblyResolve
-event 来拦截加载失败?此答案显示了在所有其他方法都失败时如何使用此事件从与正在执行的程序集相同的文件夹中加载程序集。我认为正确的方法是改用调用程序集(因为执行程序集可能是定义事件处理程序的程序集)。我尚未成功测试此解决方法。
请注意,我已经使用其他程序集进行了测试,以确保这不是基础设施问题。
编辑 2: 如前所述,插件 DLL 是由多个程序集组成的合并 DLL。我已经使用这种方法来确定直接依赖关系,而且似乎 Infragistics 不是其中之一。这可能是相关的吗?