繁体   English   中英

如何执行具有依赖项的WiX自定义操作DLL文件

[英]How to execute a WiX custom action DLL file with dependencies

我想创建一个依赖于第三方.NET DLL的CustomAction C#DLL文件(在这种特定情况下,它是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文件添加另一个二进制标记吗?

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

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

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

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

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

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

继Mensching先生的评论之后,我将填写更多细节。

假设您至少使用Wix 3.0,则可以使用MakeSfxCA.exe将依赖项打包到单个DLL中。 (这是DFT - Deployment Tools Foundation的一个加载项。)基本上,首先要确保项目正在复制依赖的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,您可以在线查找示例。

这是我发现的最佳方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM