我创建了一个基本插件,当我使用以下代码进行开发时,它运行良好:
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。
我不得不从特定的目录路径(using C# - Load Assembly from Specific Directory Path)强制加载程序集 这样做我的插件正确加载。 Petrel遇到问题的方法是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
下运行它永远不会搜索我的插件所在的路径。 尽管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存在。
答案 0 :(得分:2)
对于有效的插件,我们遇到了同样的问题。原因是使用“PluginManager”安装插件不再更改文件 petrel.exe.config 的<probing privatePath="Public;Extensions;..."/>
属性。在旧的方式安装插件在Petrel(添加模块)插件的目录中添加了“探测路径”,导致Assembly.LoadFile找到这样的目录。
编写测试...在“探测路径”中手动添加插件目录,问题将得到解决。只是还不知道为什么斯伦贝谢做出了这个改变,以及是否有更正确的方法来做到这一点。
答案 1 :(得分:0)
需要在pluginpackager.exe.config中添加purel文件夹内的插件文件夹路径