23

我想创建一个依赖于第三方.NET DLL 的 CustomAction C# DLL 文件(在这种特定情况下,它是.NET MySql.Data.dll)。我有 C# 自定义操作 DLL 文件与下面的 WiX 片段一起使用。我只是想弄清楚如何安全地将依赖项添加到自定义操作中。注意:我实际上并不需要这个第三方 DLL 文件来运行已安装的应用程序。

  <Binary Id="MyCustomAction.dll" SourceFile="MyCustomAction.CA.dll" />

  <CustomAction Id="FixupConfigForMysql" Return="check" />

  <InstallExecuteSequence>
     <Custom Action='FixupConfigForMysql' After='InstallFiles'>NOT Installed</Custom>
  </InstallExecuteSequence>

我是否需要安装第三方 DLL 文件 ( MySql.Data.dll) 才能运行自定义操作?

我可以在第三方 DLL 文件中添加另一个二进制标签吗?

4

4 回答 4

25

WiX 工具集中的 DTF 具有将您的自定义操作程序集及其所有引用包含到单个二进制文件(基本上是自解压 dll)中的机制。我不编写托管自定义操作(C/C++ 创建具有较少依赖项的自定义操作并提高成功率),但它应该只在 VS 中构建时工作。

于 2009-10-20T04:18:25.587 回答
5

您可以使用<Binary />添加运行自定义操作所需的任何文件。这也适用于您需要的任何第 3 方 dll。使用二进制元素包含的文件仅在安装期间使用,不会被视为正在安装的应用程序的一部分。

更新: CustomAction 和 Binary 之间的连接是通过使用 BinaryKey 属性从自定义操作中引用二进制文件来完成的。

除非您可以有多个 BinaryKey 属性(我没有尝试过,并且在MSI 自定义操作表中没有直接看到对此的任何支持),否则您只能根据一个二进制文件进行自定义操作。因此,该二进制文件将需要在其内部携带所有必要的依赖关系。

也就是说,如果您的 dll 都是 .Net 程序集,一个想法是使用ILMerge将它们打包到一个程序集中。

于 2009-10-20T00:13:47.030 回答
5

在 Visual Studio 中将硬引用上的“复制本地”属性设置为 True。

于 2010-03-05T08:33:48.863 回答
1

在 Mensching 先生的评论之后,我将补充一点细节。

假设您至少使用 Wix 3.0,您可以使用 MakeSfxCA.exe 将依赖项打包到单个 DLL 中。(这是 DFT 的一个插件——部署工具基金会。)基本上,首先要确保项目正在复制您的依赖 DLL。制作一个 CustomAction.config 文件。使用简单的 .bat 文件进行测试,例如:

REM MyMakeSfxCA.bat - Run under $(TargetDir); abs. paths reqd.
"%WIX%\SDK\MakeSfxCA" ^
    %cd%\Managed_custom_action_pkg.dll ^
    "%WIX%\SDK\x86\sfxca.dll" ^
    %cd%\Managed_custom_action.dll  ^
    %cd%\Dependent1.dll ^
    %cd%\Dependent2.dll ^
    %cd%\Microsoft.Web.Administration.dll ^
    %cd%\Microsoft.Deployment.WindowsInstaller.dll ^
    %cd%\CustomAction.config 

一旦成功,转换为构建后事件:

"$(WIX)\SDK\MakeSfxCA" ^
    $(TargetDir)\Managed_custom_action_pkg.dll ^
    "$(WIX)\SDK\x86\sfxca.dll" ^
    $(TargetDir)\Managed_custom_action.dll  ^
    $(TargetDir)\Dependent1.dll ^
    $(TargetDir)\Dependent2.dll ^
    $(TargetDir)\Microsoft.Web.Administration.dll ^
    $(TargetDir)\Microsoft.Deployment.WindowsInstaller.dll ^
    $(TargetDir)\CustomAction.config

在您的 .wxs 文件中,您的二进制密钥将如下所示:

<Binary Id="Managed_custom_action_CA_dll" 
        SourceFile="$(var.Managed_custom_action.TargetDir)$(var.Managed_custom_action.TargetName)_pkg.dll" />

对于他们的 CustomAction.config,您可以在网上找到示例。

这是我找到的最好的方法。

于 2015-06-18T15:47:24.540 回答