【问题标题】:Private Assembly and transitive DLL dependencies?私有程序集和传递 DLL 依赖项?
【发布时间】:2016-04-22 08:52:02
【问题描述】:

好的,所以我已经成功地为我的可执行文件的插件设置了我的Private Assembly,例如described here:(这只是一个示例,我的用例在技术上是相同的,但对于插件来说不是这样。)

  • 可执行文件使用应用程序清单在 plugins 程序集上声明 dependentAssembly
  • plugins 子目录包含 plugins.manifest
  • plugins.manifest 声明 assemblyIdentity 和 files 列出插件 DLL(例如,easyplug1.dll 和 xplug2.dll)

我不太明白,也没有找到任何直接解释,私有程序集中的 DLL 所依赖的 DLL 是什么?它们应该位于哪里,如何找到它们?

示例:xplug2.dll,它本身就是 3rd 方需要 3rd 方 dll xbase.dll。当然,xbase.dll 也简单地部署在 plugins 目录中。这够了吗? 私有程序集是否需要列出仅由(可执行)模块传递使用的 DLL,以声明其对 plugins 程序集的依赖关系?


到目前为止的部分答案通过反复试验:

(A) 似乎 所有 DLL,以及那些仅从其他“插件”DLL 中使用的 DLL 必须列在 Private Assembly 清单中——即基本上应该列出 所有 plugins 程序集目录中的 DLL 文件。

(A.1) 任何未列出的 DLL 将不会在目录中找到,即使它是从同一子目录中的 DLL 引用的。

(A.2) 我假设这是由于所有 DLL 加载机制使用来自可执行文件的(仅)自定义 Activation Context,如果在其中找不到 DLL,它似乎从可执行目录中搜索。

(A.3) 我尝试使用 the latest version 的 Dependency Walker (2.2.10011) 查看依赖链,但它似乎根本无法处理这种传递场景:主要依赖关系显示正确​​,但是传递的次要依赖不是从清单中解析的,而是相对于基目录。 (似乎它遵循plain LoadLibrary semantics for 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

【问题讨论】:

    标签: windows dll manifest assemblies loadlibrary


    【解决方案1】:

    简单的答案是,将使用应用程序激活上下文和/或默认 dll 搜索规则搜索任何不属于程序集的“原始”dll。并且 dll 搜索路径包括应用程序文件夹,但不包括找到 dll 的任何文件夹(即,一个 dll 永远不会期望加载另一个偶然在同一文件夹中的 dll)。

    因此,例如,如果您的程序集中的一个 dll 需要 openssl.dll,那么它将首先在 application.exe 的文件夹中搜索,而不是您的私有程序集文件夹,除非您明确明确地将 openssl 添加到您的私有程序集。

    答案是将 openssl.dll 显式添加到私有程序集(如果不同的 dll - 在不同的程序集中 - 需要不同版本的 openssl.dll,这顺便有助于保护应用程序的完整性)

    在您的情况下,您可能有两个不同的私有程序集,每个程序集都使用 xbase.dll 的私有版本 - 这两个不同的 xbase.dll 可能完全不兼容。

    【讨论】:

    • 干杯!我想的也差不多。很高兴从这件事的专家那里听到这个;-)(我想我从你关于这个话题的回答中学到的东西比从其他任何人那里学到的都多。)除此之外:奇怪的是,依赖步行者根本无法应对这个问题,但我想我'我必须忍受这个。
    • dependency walker 很遗憾从未更新以理解程序集。
    • 另外,我不知道我是否仍然是专家:P - 我对这个主题的大部分回复似乎都是 6 岁或以上。哇。
    猜你喜欢
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多