【问题标题】:(Wix installer) how to include custom action dependency(Wix 安装程序)如何包含自定义操作依赖项
【发布时间】:2020-04-12 23:39:44
【问题描述】:

我在安装解决方案中有 3 个项目:

  1. 用 c# 编写的自定义操作 dll
  2. 用 c++ 编写的自定义操作 dll
  3. Util dll 也用 c++ 编写(c# 和 c++ 使用它,如 互操作)

问题是如何将 Util.dll 添加到 wix 安装程序中,

当我将此 dll 复制/粘贴到 C:\ProgramFiles\SystemWOW64\(msiexec.exe 目录)中时,一切正常,但这是一个糟糕的解决方法,我想避免。

我尝试过的: 1) 添加作为对 MSI 项目的引用并包括:

   <?xml version="1.0" encoding="utf-8"?>
   <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
      <Fragment>
         <Binary Id="CPlusPlusAction" SourceFile="$(var.CPlusPlusAction.TargetDir)$(var.CPlusPlusAction.TargetName).CA.dll"/>
         <Binary Id="CSharpAction" SourceFile="$(var.CSharpAction.TargetPath)"/>
         <Binary Id="Utils" SourceFile="$(var.SolutionDir)/$(var.Utils.Configuration)/Utils.dll"/>
         <CustomAction Id="FunctionOne" Impersonate="no" Return="ignore" Execute="commit" BinaryKey="CPlusPlusAction" DllEntry="FunctionOne" />
         <CustomAction Id="FunctionTwo" Impersonate="no" Return="ignore" Execute="commit" BinaryKey="CSharpAction" DllEntry="FunctionTwo"/>
      </Fragment>
  </Wix>

2) 使用 CopyLocal = true 添加作为对两个项目的引用

我搜索了很多,但仍然找不到解决方案(Wix Doc、StackOverflow、msdn 等)

提前致谢

【问题讨论】:

  • 可能很愚蠢,但是您可以尝试为它添加一个 CustomAction,并且永远不要对操作进行排序吗?
  • 我不推荐托管代码。尽可能使用 C++,但如果您:1) Right click the Custom Action project, 2) 选择 Add b> =&gt; Existing Item... =&gt; 3) Add the C++ DLL?重新构建并在输出窗口中查看 dll 是否已编译为托管代码 (DTF) 的 FileName.CA.dll Win32 包装 dll。
  • 也许还要注意任何位问题Here is an answer on this topic.
  • 又是2007年吗?如今,托管的自定义操作很好。 DTF 会为您打包您的依赖项,让这个问题变得毫无意义。

标签: c# c++ dependencies wix windows-installer


【解决方案1】:

感谢各位大神解答,终于搞明白了。

首先你需要把这个 Util.dll 添加到 Msi 二进制表中:

<Binary Id="Utils" SourceFile="$(var.SolutionDir)/$(var.Utils.Configuration)/Utils.dll"/>

如果您不确定使用 Orca 在 .msi 文件中查看它

Christopher 对 c# 说的第二个问题是 RightClick -> 添加现有项目 -> Utill.dll,然后 DFS 在安装过程中将其解压缩到 C:/windows/installation/"CustomActionId" 中,一切正常,但是...

问题出在 c++ 方面,Wix 不适用于这种语言,因此您需要在安装过程中处理好所有事情,例如编写代码来读取安装程序的 BinaryTable、读取数据并清除所有 msdn 这是一个很多代码

所以我更喜欢为 util 编写 CLR 包装器, 将 Util 构建为 lib,因此在 c++ 端将其构建在 CA.dll 中,并将作为 lib 添加到 wrapper,所以现在您可以在 c# 中使用 wrapper.dll

【讨论】:

    【解决方案2】:

    对于 C# 托管的自定义操作,我认为您不能添加本机 dll 作为参考。因此,改为将其添加为带有操作副本的内容,我很确定 DTF 会将其打包并在自定义操作执行时使其在临时目录(进程的当前目录)中可用。

    对于 C++,我使用 InstallShield 中的 ISSetup.dll / ISSetupFile 模式,或者如果可以的话,静态链接库。

    【讨论】:

      猜你喜欢
      • 2019-02-22
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多