1 DLL中的私有并排汇编 - 它与通常的DLL相同吗?

时间:2011-01-23 14:22:53

标签: windows dll assemblies native side-by-side

我正在寻找Microsoft Windows中的并排程序集和隔离的应用程序解决方案。

文档说:

  

私有程序集是一个程序集   与应用程序一起部署并且是   可供专用   该申请。

  

私人集会必须设计为   与其他版本并行工作   系统上的装配。

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

有人可以向我解释一下吗?

如果确实如此 - 那么这些程序集优于通常的重定向DLL的优点是什么?它们对我来说似乎很相似,而且似乎甚至没有在这里使用过。

2 个答案:

答案 0 :(得分:3)

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

但是有一些优点:

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

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


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

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

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

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

  • 当需要加载特定版本的dll时,使用ActivateActCtx激活相应的激活上下文,然后在dll的简单名称上调用LoadLibrary。在调用之后将其取消激活,加载dll后,不再需要激活上下文激活 - 直到&除非您再次调用需要搜索激活上下文的API函数 - 例如创建一个在dll中托管的类的窗口,或者创建一个免费注册的com对象。

系统将 - 在加载dll时 - 搜索提供的lpAssemblyDirectory以获取它可能具有的dll和任何依赖程序集。

答案 1 :(得分:1)

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