0

我正在查看 Microsoft Windows 中的并行程序集和隔离应用程序解决方案。

文档说:

私有程序集是与应用程序一起部署的程序集,可供该应用程序独占使用。

私有程序集必须设计为与系统上其他版本的程序集并行工作。

但是,私有程序集的部署过程只是将程序集复制到应用程序的文件夹(或具有程序集名称的子文件夹)中。因此,应用程序不能使用多个版本的私有程序集。因为如果您放置另一个版本的私有程序集 - 它会覆盖旧版本。

谁可以给我解释一下这个?

如果确实如此 - 那么此类程序集与通常的带有重定向的 DLL 相比有什么优势?它们对我来说似乎非常相似,并且 manifest 似乎甚至没有在这里使用。

4

2 回答 2

3

使用私有 SxS 程序集来部署 dll 实际上只是一种使事情更频繁失败的复杂方法。

不过也有一些优点:

  • SxS 程序集更安全,因为只会搜索 WinSxS 文件夹和 EXE 的文件夹。
  • SxS 程序集是免注册 COM 所必需的。这意味着您可以使用捆绑为 SxS 程序集的 COM 对象部署应用程序,该程序可以通过 XCopy 安装且无需提升。
  • 当您意识到即使作为私有 SxS 程序集安装时也可以使用该技术加载同一 Dll 的多个不同版本时,SxS 程序集开始变得更加强大。在正常的事件过程中,当 Windows 加载程序加载您的 EXE 文件并处理其清单以创建激活上下文时,它使用应用程序文件夹作为 SxS 搜索的基本文件夹。

但是,您可以在运行时使用Activation Context API和您指定的基本文件夹创建自己的激活上下文,然后搜索私有 SxS 程序集。您可以使用此技术动态加载可选程序集,或在必要时使用不同版本的程序集来实现某种插件 api。


要使用激活上下文 API,您需要:

  • 意识到这不能用于静态绑定的资源,因为这些资源总是加载在 OS 加载器生成的上下文中。

  • 创建一些应用程序清单文件,描述您希望选择加载的依赖程序集,这些程序集随应用程序一起提供 - 外部或嵌入为资源 ID > 16 的 RT_MANIFEST 资源。

  • 使用清单所在位置的详细信息填充ACTCTX结构,并确保 lpAssemblyDirectory 指向包含特定版本的私有 SxS 程序集的目录。调用 CreateActCtx 创建一个激活上下文对象。

  • 当需要加载特定版本的 dll 时,使用ActivateActCtx 激活适当的激活上下文,然后在 dll 的简单名称上调用 LoadLibrary。在调用后停用它,因为加载了 dll,激活上下文不再需要处于活动状态 - 直到 & 除非您再次调用需要搜索激活上下文的 API 函数 - 例如创建一个类的窗口托管在 dll 中,或者创建一个免费注册的 com 对象。

系统将 - 在加载 dll 时 - 在提供的 lpAssemblyDirectory 中搜索 dll 以及它可能具有的任何相关程序集。

于 2011-01-23T20:26:53.467 回答
1

好吧,每个 EXE 都有自己的私有 DLL。这里没有覆盖,您将每个 EXE 放在其自己的安装目录中。它们可以通过设计具有不同版本的 DLL,DLL Hell 是不存在的。除此之外,这些 DLL 可能会触及文件系统或注册表的其他部分并相互踩踏。提到“必须设计为并排工作”。这很少很难实现。

于 2011-01-23T14:39:57.993 回答