2016-04-22 42 views
0

好了,我已经成功地建立了我Private Assembly我我的可执行文件的插件,像described here(这只是一个例子,我的使用情况在技术上是相同的,但不是插件本身。)私有程序集和传递DLL依赖关系?

  • 可执行文件使用的应用程序清单上plugins装配申报dependentAssembly
  • plugins子目录包含plugins.manifest
  • plugins.manifest声明assemblyIdentityfiles列出插件DLL(S)(比方说,easyplug1.dllxplug2.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 semanticsthe 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 

回答

1

简单的答案是,任何“原始”的DLL是不是一个组装的一部分,将搜索使用应用程序激活上下文和/或默认的dll搜索规则。而DLL的搜索路径包括应用程序文件夹,但没有任何文件夹的DLL被发现(即一个DLL永远不会期望加载另一个DLL,偶然在同一文件夹中)。因此,例如,如果您的程序集中的某个dll需要openssl.dll,那么它会首先在application.exe的文件夹中搜索,而不是您的私有程序集文件夹,除非您特别明确地向您的私有程序集添加了openssl。

答案是明确添加openssl.dll私人组件(这亦有助于保护应用程序的完整性,应该在不同的dll - 需要不同的版本openssl.dll的 - 在不同的装配)

在你的情况下,你可以有两个不同的私有程序集,每个程序集都使用私有版本的xbase.dll--其中两个不同的xbase.dlls可能非常不兼容。

+0

干杯!我想了很多。很高兴听到这个问题的专家在这件事上;-)(我认为我从这个主题的答案比从其他人学到更多。)另外:好奇依赖沃克无法应付这个,但我想我'必须忍受这一点。 –

+0

依赖沃克很遗憾从未更新了解组件。 –

+0

加上,我不知道我是否仍然是专家:P - 似乎我对这个主题的回复大多数都是6岁或以上。哇。 –