2

我们正在为我们的插件构建一个 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的目录中,则可以正常工作。看起来正确,但没有对依赖项的引用。清单包含插件目录中每个文件的一个条目,包括.probingPathpetrel.exe.configplugin.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 不是其中之一。这可能是相关的吗?

4

3 回答 3

1

如果您选择使用 AppDomain.CurrentDomain.AssemblyResolve 事件,我会非常小心。在这种情况下,它可能会显着降低应用程序的性能。您使用的是什么混淆工具。也许,最好的方法是看看为什么混淆会影响 .NET 中的 ReferenceAssemblies 调用。也许这是有意设计的。在这种情况下,您可能希望禁用对程序集的该部分进行混淆。

于 2011-07-05T14:52:59.320 回答
0

这是一个奇怪的问题。我刚刚在我的插件上测试了一个类似的设置,它使用 FMOD 库来播放音乐。fmod dll 在部署列表中被引用,它们显示在 PIP 的清单文件中,并且它们安装在插件安装目录中(在插件管理器定义的路径下)。该插件在@运行时工作。也许与 Petrel 使用的基础设施库有冲突?

于 2011-06-29T12:39:24.550 回答
0

我认为这个问题与我们程序集的混淆有关。如果我们不混淆程序集(因此将所有程序集合并为一个大程序集),一切正常。我猜这是因为 Petrel 正在加载插件程序集,检查引用程序集并递归加载依赖项。这在这种情况下不起作用,因为并非所有程序集都被列为参考程序集。

解决此问题的方法是在合并的程序集中包含参考程序集 (Infragistics)。这似乎工作正常。但是,我想这并不总是可以接受的(例如,对于 LGPL 许可库)。

另一个可能更好的方法是监听AppDomain.CurrentDomain.AssemblyResolve-event 以拦截程序集加载错误。

于 2011-06-30T09:40:27.303 回答