WiX:如何打包 exe 或 dll 以仅在安装期间使用

Posted

技术标签:

【中文标题】WiX:如何打包 exe 或 dll 以仅在安装期间使用【英文标题】:WiX: how to pack exe or dll to use only during installation 【发布时间】:2013-04-08 15:30:22 【问题描述】:

我需要在生成的 MSI 中包含一个 dll/exe(通过 WiX 项目创建),但我不想在安装过程中部署它们:我只想在某些 CustomAction 中使用它们我的目的是包含一个现有的 exe/dll 并在安装期间从 wxs 代码(而不是从 CustomAction dll)调用它。 是否可以包含在安装期间未部署的文件?我的意思是,只将它们打包到生成的 MSI 中,并在它们被解压到 %temp% 文件夹中时调用它们执行某些任务? 此外,如果有人可以通过 Product.wxs XML 代码单元展示一些如何包含 dll/exe 的示例代码,那就太好了。 谢谢。

【问题讨论】:

您打算用什么语言编写自定义操作? CustomAction 是用 C# 编写的。 【参考方案1】:

是的,使用Binary 元素包含它们。

<Binary Id='MyCustomActionBinary'
        SourceFile='$(var.CustomActionProject.TargetPath)' />

这将使它们对您的CustomAction 可用,您可以在其中使用 BinaryKey 属性来引用二进制文件:

<CustomAction Id='MyCustomAction'
              BinaryKey='MyCustomActionBinary'
              DllEntry='MyCustomFunction'
              Execute='deferred' />

【讨论】:

当然可以。但是使 blob 可用、调用和清理的基础设施是相当可观的。 C#/DTF 允许您将所有这些封装在自定义操作中以简化故事。 其实,这就是我一直在寻找的,也许我不是很清楚:我的目的是包含一个现有的 exe/dll - 并在安装过程中从 wxs 代码调用它(而不是从 CustomAction dll)。 @ChristopherPainter 我目前正在开发一个项目,其中我的项目 .exe 文件具有多个依赖项...我在哪里可以获得有关在 WiX 引导程序中包含项目 .exe 的项目依赖项的更多信息?我为我的项目引用了ExePackage,但它不包括它的依赖项。 我们应该使用多个 dll 吗?【参考方案2】:

如果您使用 C#/DTF 编写自定义操作,您只需添加 DLL 作为引用。对于任何其他类型的文件,您将它们作为 Content | 添加到项目中。 CopyAlways 和构建将自动将这些文件包含在自解压自定义操作中。当 CA 运行时,它们将在当前目录(临时目录)中可用,并在 CA 结束时自动清理。

【讨论】:

抱歉,我可能不够清楚:我不想将这些包含在 CustomAction.CA.dll 中,我希望它们通过 Product.wxs 代码包含。 为什么?意识到如果你这样做,你将不得不重新发明所有的基础设施。如果您正在调用 EXE,您可能应该使用 QuietExecCA。如果您正在调用 DLL,您可能应该将其添加为引用。否则,您必须编写从二进制表中提取的所有代码,使用反射来调用它,然后进行清理。我必须有一个非常非常有说服力的理由来做这一切,而不是利用内置功能。 好的,我明白了,然后我不会从自定义操作中调用外部 exe/dll。我只会从 wxs 代码中调用它们。无论如何,感谢您的回答,它为我澄清了很多事情:) 遗憾的是,它可能有点复杂。您计划调用的 EXE 是否具有 DLL 依赖项?如果是这样,您想从临时目录中调用它们而不是安装它们吗?如果是这样,那就有点复杂了。如果这就是你的故事,请告诉我。 不,我要调用的exe只是一个命令行实用程序,它没有依赖关系。

以上是关于WiX:如何打包 exe 或 dll 以仅在安装期间使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WiX 中执行仅在安装或卸载时执行的自定义操作?

如何使用 Wix 和项目参考部署本机映像 (NGen)

vs 如何将dll打包到exe中

C# 将dll打包到程序中

带有COM dll和服务的Wix安装程序

WiX MSI 和 EXE 作为一个 EXE