好了,我已经成功地建立了我Private Assembly我我的可执行文件的插件,像described here:(这只是一个例子,我的使用情况在技术上是相同的,但不是插件本身。)私有程序集和传递DLL依赖关系?
- 可执行文件使用的应用程序清单上
plugins
装配申报dependentAssembly
plugins
子目录包含plugins.manifest
plugins.manifest
声明assemblyIdentity
与files
列出插件DLL(S)(比方说,easyplug1.dll
和xplug2.dll
)
我不完全得到,并且尚未发现任何直接解释,是怎么样的DLL动态链接库中私人大会取决于?它们应该放在哪里,它们是如何找到的?
例如:xplug2.dll
,这是第三方本身需要第三方DLL xbase.dll
。当然,xbase.dll也只是部署在插件目录中。这够了吗? 专用程序集是否需要列出只由(可执行)模块声明其依赖于plugins
程序集的DLL传递的DLL?
部分答案至今通过试错:
(A)这似乎所有 DLL文件,还有那些只能从其他“插件” DLL的使用必须在私有配件上市清单 - 即基本上应该列出全部 DLL文件在plugins
汇编目录中。 (A.1)在目录中任何未列出的DLL 都不会找到,即使它是从相同子目录中的DLL引用的。
(A.2)我承担这是由于所有的DLL加载机使用(只)定制Activation Context从可执行文件,如果DLL没有找到,它似乎从内搜索可执行目录。
(A.3)我试图寻找与Dependency Walkerthe latest version(2.2.10011)的依赖链,但似乎不能在所有处理这种传递方案:主要依赖关系的正确显示,但传递辅助依赖关系不是从清单解析的,而是相对于基本目录解析的。(好像它遵循plain LoadLibrary
semantics为the transient ones.)
文件布局:
...\base\app.exe
// - contains Application Manifest declaring dependency on `plugins`
// - Loads xplug2.dll
...\base\plugins\xplug2.dll
// - Loads xbase.dll (which is only used by xplug2.dll internally)
...\base\plugins\xbase.dll
...\base\plugins\plugins.manifest
// - lists xplug2.dll (for sure)
// - *seems* to need to list also xbase.dll
干杯!我想了很多。很高兴听到这个问题的专家在这件事上;-)(我认为我从这个主题的答案比从其他人学到更多。)另外:好奇依赖沃克无法应付这个,但我想我'必须忍受这一点。 –
依赖沃克很遗憾从未更新了解组件。 –
加上,我不知道我是否仍然是专家:P - 似乎我对这个主题的回复大多数都是6岁或以上。哇。 –