我创建了一个基本插件,当我部署它进行开发时它运行良好:
del "$(ProjectDir)\plugin.xml" "%Ocean2012Home%\PluginPackager.exe" /g "$(TargetPath)" "$(ProjectDir)\plugin.xml" "%Ocean2012Home%\PluginPackager.exe" /mh "$(ProjectDir)\plugin.xml" "%OCEAN2012HOME%\petrel.exe" "$(TargetDir)"
正如海洋开发指南所指出的那样。
当我尝试做一些更复杂的事情时,它告诉我它找不到其中一个 dll 及其引用。dll 存在于我的项目正在构建的位置。我检查了 ProcMon,我可以看到 Ocean 没有检查该文件夹中的 dll。
我不得不强制从特定目录路径加载程序集(使用 C# - 从特定目录路径加载程序集)这样做我的插件正确加载。Petrel 遇到问题的 dll 是 InfragisticsWPF.DockManager.dll
我与正在研究 Petrel 的其他团队进行了交谈,有些人向我提到,自 2012 版本以来,他们必须强制对他们的一些 dll 进行 LoadAssembly,因为 Petrel 找不到它们。在 2011 版本中运行良好的东西。也许是 2012 年引入的一些变化导致了这种情况?我们是否缺少一些配置?
更新
根据要求,这是 Fusion Log Viewer 显示的内容:
对于它试图访问的InfragisticsWPF.DockManager.DLL
从以下位置加载的程序集管理器:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 在可执行文件 C:\Program Files\Petrel 2012.3\petrel.exe 下运行
- C:/Program Files/Petrel 2012.3/ 和很多像“Extensions” 这样的子目录 看起来它遍历了 C:/Program Files/Petrel 2012.3/ 里面的所有文件夹
- 它也尝试在相同的文件夹中搜索InfragisticsWPF.DockManager.EXE 。
- 所有探测 URL 均已尝试但均失败。
它从不搜索我的插件所在的路径。尽管 Petrel 无法加载InfragisticsWPF.DockManager.DLL,但它不会无法加载我的任何其他 dll。对于我的其他 dll,日志看起来完全一样,但最后一次尝试检查我的插件所在的文件夹:
LOG: Attempting download of new URL
file:///c:/myFolder/MyAssembly.DLL.
LOG: Assembly download was successful. Attempting setup of file: c:\myFolder\myAssembly.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: MyAssembly, Version=1.0.0.0, Culture=neutral
LOG: Where-ref bind Codebase does not match what is found in default context. Keep the result in LoadFrom context.
LOG: Binding succeeds. Returns assembly from c:\myFolder\myAssembly.dll.
LOG: Assembly is loaded in LoadFrom load context.
两个 dll 彼此相邻,但由于某种原因,Petrel 与 InfragisticsWPF.DockManager.DLL存在问题,而其他任何 dll 都没有。