使用 CustomAction 卸载 Wix 时出现问题

2023-12-05

我创建了一个非常简单的 MSI,它将一些文件复制到 ProgramFiles 目录,并在安装时调用在用 C# 编写的二进制文件中找到的自定义操作。

安装时,我可以轻松调用我想要的任何自定义操作。例如,我创建了一个安装步骤,用户应在其中输入许可证,并在确认许可证后,使用 C# 自定义操作中编写的逻辑对服务器进行检查。

但是,卸载时,每次添加自定义操作(即使它除了返回成功之外什么也不做),我都会收到安装失败的错误。

这就是我使用卸载步骤的方式:

<InstallExecuteSequence>
  <Custom Action='TestUninstallation' After='MsiUnpublishAssemblies'>REMOVE="ALL"</Custom>
</InstallExecuteSequence>

其中 TestUninstallation 定义如下:

<CustomAction Id="TestUninstallation" Return="check" Execute="deferred" Impersonate="no" BinaryKey="TestCustomAction" DllEntry="Uninstall" />

属性 DllEntry 等于 Uninstall,这是一个仅返回 Success 的 C# 方法。

安装完成后,我尝试卸载,并获得在 AdminUISequence 中定义的 UserExit 对话框,其属性为 OnExit。

知道我错过了什么吗?


调试:托管代码相对容易调试(本机代码实际上更容易)。以下是一些提示:

  • 调试 C# 自定义操作 (高级安装程序)
  • 不同的调试方法/方面

建议: 我想你只是有一个broken reference to the dll export function- 换句话说,错误的 dll 函数名称/引用:

<CustomAction Id="TestUninstallation" Return="check" Execute="deferred" Impersonate="no"
              BinaryKey="CustomActions" DllEntry="__ERRONEOUS FUNCTION REFERENCE__" />

只需检查 dll 实际导出并匹配的内容,如下所示:

<CustomAction Id="CustomAction1" BinaryKey="CustomActions" DllEntry="CustomAction1"/>

与往常一样,真正的 McCoy 是检查 dll 本身,看看你是否有正确的函数名称(下面的屏幕截图来自之前的答案,建议阅读).

This is a native code C++ dll:

Dependency Walker

This is a DTF-packaged managed code dll:

Managed Code Custom Action

请注意,这是一个嵌入了托管代码内容的本机 dll。它会产生一个非常不同的函数列表,但您仍然必须在其中找到您引用的函数名称。

This is a straight-up managed code dll (no native wrapping):

Managed code dll, unwrapped

最后:这是直接托管代码 DLL,未包装在本机 dll shell 中。


不可卸载的安装程序:当自定义操作在卸载过程中崩溃或失败时,您将在删除安装时遇到问题(它只是回滚,您将无法继续安装)。有多种修复或解决方法。

在我看来,总体修复是在卸载时不要使自定义操作失败,或者至少调节它们,以便您可以通过命令行设置属性来强制卸载:

在MSI属性表中设置:SUPPRESSERROR = 0。然后 - 当需要时 - 在命令行上设置:

msiexec.exe /x {PRODUCT-GUID} SUPPRESSERROR="1"

在 MSI 中,您可以使用以下命令来调节卸载自定义操作:

REMOVE="ALL" AND SUPPRESSERROR="0"

现在,如果 SUPPRESSERROR 不是 0,则自定义操作将不会运行。

有一个较旧的答案,其中有几个进一步的选项:我搞砸了,如何卸载我的程序?(由维姆·科南,我用更多的建议搞乱了他的答案)。


样板文件:为了快速使用,让我在这里转储一个样板临时自定义操作测试项目。这假设有一个名为的 C# 托管代码自定义操作项目"CustomAction1"在同一个 Visual Studio 解决方案中,并在 WiX 源中添加了一个引用 - 就像您显然已经有的那样(这是为了稍后我们都忘记问题是什么并需要再次测试时使用):

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="WiXCustomActionsTesting" Language="1033" Version="1.0.0.0"
           Manufacturer="test" UpgradeCode="PUT-GUID-HERE">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <UIRef Id="WixUI_Mondo" />
    <Property Id="SUPPRESSERROR" Value="0" Secure="yes" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes" />

    <Feature Id="ProductFeature" Title="WiXCustomActionsTesting" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
    </Feature>

    <!--BEGIN CUSTOM ACTION SECTION-->

      <Binary Id="CustomActions" SourceFile="$(var.CustomAction1.TargetDir)\$(var.CustomAction1.TargetName).CA.dll" />
      <CustomAction Id="TestUninstallation" Return="check" Execute="deferred" Impersonate="no" BinaryKey="CustomActions" DllEntry="CustomAction1" />

      <InstallUISequence></InstallUISequence>

      <InstallExecuteSequence>
        <Custom Action='TestUninstallation' After='InstallInitialize'></Custom>
      </InstallExecuteSequence>

    <!--END CUSTOM ACTION SECTION-->

  </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="WiXCustomActionsTesting" />
            </Directory>
        </Directory>
    </Fragment>

  <Fragment>

    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">

      <Component>
        <File Source="C:\Projects\MySetup\MyApp.exe">
        </File>
      </Component>

    </ComponentGroup>

  </Fragment>
</Wix>
  1. 创建 WiX 项目
  2. 复制粘贴代码,设置新的升级指南
  3. 创建CustomAction项目,默认名称
  4. 添加对 wix 项目中的自定义操作项目的引用
  5. 添加对 WiXUIExtension.dll 的引用
  6. 调整组件中文件的路径
  7. Compile
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CustomAction 卸载 Wix 时出现问题 的相关文章

  • 如何编译Python 1.0

    出于某种反常的原因 我想尝试Python 1 0 我将如何编译它 或者更确切地说 可以使用当前编译器干净地编译的早期版本是什么 我使用的是 Mac OS X 10 5 不过因为这只是出于好奇 关于语言如何变化 所以在 Linux 虚拟机中编
  • 从对话框调用 CustomAction 时出现 WiX 安装错误 2762

    我是初学者 开始学习WiX 我想在安装过程中捕获 验证和注册用户详细信息 我创建了一个对话框来捕获用户注册并在用户单击 下一步 后调用自定义操作 但在这里我收到安装程序错误 2762 虽然错误描述说 必须在 InstallInitializ
  • 在 Windows 上安装 MonoDevelop:满足 Gtk# 要求的解决方法?

    我已经安装了Mono 版本2 11 4 在我的Windows 7系统上 现在我打算安装单一开发 版本 3 0 4 7 然而 当我开始单一开发安装程序我收到以下错误消息 并且安装终止 好的 这可以通过获取轻松解决Gtk 安装程序来自here
  • 安装MySQLdb(对于python)作为非压缩的egg

    安装说明是 python setup py build sudo python setup py install or su first 这给了我一个 egg 文件 如何告诉安装程序将文件转储为普通的未压缩库 Thanks 好吧 我不想回答
  • 确保在 ServerName 上启用默认 admin$ 共享

    运行 psexec 命令在同一网络上的服务器上远程安装或执行某些内容时 显示以下错误 无法访问服务器名称 找不到网络名称 确保在 ServerName 上启用默认 admin 共享 大多数参考文献建议您将以下内容添加到注册表中 但在我的例子
  • IIS:添加功能

    我需要使用 IIS 7 0 中的 IP 地址和域限制功能编辑 IP 规则 但在我的 Windows 7 计算机上 我的 IIS 中不存在此功能 有谁知道如何向 IIS 添加此功能 我无法在任何地方找到下载 或 IIS 中用于添加功能的部分
  • Pipx 构建包失败

    当我运行命令 pipx install eth brownie 时 我收到以下错误消息 fatal error from pip prevented installation Full pip output in file Users ge
  • WiX - 通过检查修订来防止降级

    我正在寻找一种方法来防止我的应用程序降级 但 问题 是 我必须检查修订号 例如 安装 1 0 0 1 时应该可以安装 1 0 0 2 但安装 1 0 0 2 时不应该安装 1 0 0 1 我知道 Element MajorUpgrade 仅
  • Mac 10.8.3 上的 fltk 安装

    我正在挣扎fltk在我的 Mac 上安装 我想在Xcode 4 下载文件并解压缩后 尝试按照说明操作 2 3 Configuring FLTK Stay in your FLTK source code directory Type aut
  • Google Cloud SDK 安装失败 UnicodeDecodeError:“ascii”编解码器

    我在安装时遇到以下错误谷歌云SDK https cloud google com sdk docs 在我的 Windows 10 计算机上 ERROR gcloud failed to load ascii codec can t deco
  • 使用“Any CPU”而不是“X86”编译wix项目

    当我编译一个wix项目 并且wix通过MSbuild启动所有现有项目的编译时 我可以使用 任何CPU 而不是 X86 或 64位 吗 如果没有 我如何使用 任何CPU 编译项目 如果您的问题是是否可以编译 WIXPROJAny CPU那么答
  • 如何使用 setuptools Windows 安装程序在开始菜单中创建快捷方式

    我想为我的 Python Windows 安装程序包创建开始菜单或桌面快捷方式 我正在尝试遵循https docs python org 3 4 distutils builtdist html the post 安装脚本 https do
  • pip install ecos 错误,显示“需要 Microsoft Visual C++ 14.0”。 [复制]

    这个问题在这里已经有答案了 我正在尝试使用 pip install 在我的 anaconda 中安装 fancyimpute 但错误显示由于 需要 Microsoft Visual C 14 0 而无法安装 ecos 提供的链接已过期 有谁
  • 用于配置编辑的 wix 自定义对话框

    你好 我正在尝试使用 wix v3 为我的应用程序设置 msi 我对这项任务有疑问 我需要一个用户输入 该输入将存储在我的应用程序的配置文件中 例如 我需要一个用于 sql 连接字符串的对话框 并且用户输入将写入应用程序配置文件中 我尝试用
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • Burn in WiX 3.6 如何将 MSI 文件捆绑到 .exe 中?

    我有兴趣了解 WiX 如何捆绑使用 Burn 创建的 EXE 文件 我知道创建一个自解压 EXE 文件非常简单 我已经完成了一百万次了WinRAR http en wikipedia org wiki WinRAR EXE 文件解压到哪个目
  • Magento 设置脚本中的 ALTER TABLE 不使用 SQL

    乔纳森 戴 https stackoverflow com users 336905 jonathan day says 更新不应采用以下形式 SQL命令 我没遇到过 任何 DDL 或 DML 语句不能 通过 Magento 的配置执行 结
  • 在 Windows 7 上安装 Visual Studio 2015 社区版

    我尝试在 Windows 7 64 位上安装 Visual Studio 2015 社区版 由于某种原因 安装程序显示 安装被阻止 并显示错误 此版本的 Visual Studio 需要一台装有较新版本 Windows 的计算机 为了完全安
  • 我无法让 ruby​​ 开发工具包适用于 Windows XP

    所以 我一生都无法让它正常工作 我的最终目标是安装 dbd odbc gem 并使其正常工作 从我读过的多篇文章来看 我需要安装ODBC 绑定 http www ch werner de rubyodbc 对于 ruby 以及 dbd od
  • 安装后执行批处理文件,并在 Inno Setup 中“完成”页面之前的自定义页面上显示其输出

    A cmd使用此解决方案可以在 Inno Setup UI 中显示输出 Inno Setup 安装程序中的嵌入式 CMD 在自定义页面上显示命令输出 https stackoverflow com q 56910906 850848 我的问

随机推荐

  • 从密封派生类继承的解决方法?

    我想从派生类派生SealedDerived但我不能 因为班级是sealed 如果我从基类派生Base 有什么办法可以 欺骗 并重定向this对某个对象的引用SealedDerived class 例如 像这样 public class Ba
  • 从 Maven 标准目录映射到 Bazel 以获取测试资源

    我们有测试依赖文件src test resources根据Maven 标准目录布局 当测试类通过以下方式获取这些测试文件时 这些测试文件最终会出现在 JAR 和类路径中 Resources asCharSource Bazel 中依赖测试文
  • 我想向 mysql 日期行添加 30 天

    My Code
  • SCNVector3 组件的类型是什么? CGFloat 还是浮动?

    苹果文档给出了 SCNVector3 的声明 typedef struct SCNVector3 CGFloat x y z SCNVector3 或者当尝试编写重载函数时 func left SCNVector3 right CGFloa
  • 重命名 Woocommerce 单一产品页面中的“描述”选项卡

    我将此代码粘贴到 function php 中 但它没有按预期重命名产品页面选项卡 http www noushasasart com product harsh bark function woo remove product tabs
  • 有效数字四舍五入

    在 iPhone 的 Xcode Objective C 中 我有一个值为 0 00004876544 的浮点数 如何让它在第一个有效数字之后显示到小数点后两位 例如 0 00004876544 将读取为 0 000049 我没有通过编译器
  • win32 应用程序内的 Microsoft 广告

    是否可以在传统 win32 应用程序中使用新的 Microsoft Advertising JS 模块 来自 Windows 8 Metro 我有 win32 应用程序 我想在其中使用 Microsoft Advertising 实现一些添
  • jQuery 表到 CSV 导出

    我正在使用 jQuery Table to CSV 插件 我更改了弹出窗口 以便它告诉浏览器下载 CSV 文件 It was function popup data var generator window open csv height
  • 读取使用 urllib2 检索的 Excel 对象

    我正在使用 urllib2 获取 Excel 文件并保存到下面的响应中 我希望能够使用 xlrd 或类似工具处理这个 excel 文件 我在下面提供了一些信息 如果我可以提供更多信息 请告诉我 如何将响应对象转换为我可以玩的对象 respo
  • 列出 Android 设备上的所有一种文件类型?

    例如 我想检索内部和外部存储上所有 mp3 文件的列表 我也想要路径 String 每个 mp3 文件以供参考 将它们存储在List 我该怎么做 这是一个相对昂贵的操作吗 如果是这样 是否应该将其放在一个线程上 并在运行时向用户显示 正在加
  • 带有文本的 SQLServer IDENTITY 列

    如何在 SQL Server 中创建 IDENTITY 列并在列中包含文本 Example ABCD 987065 ABCD 987066 ABCD 987067 除了其他答案之外 您还可以创建一个计算列放在桌子上以提供您所要求的内容 CR
  • @Transactional 在 Spring Web MVC 中不起作用?

    当我在 spring mvc 中调用 EntityManager persist 时 出现异常 Transactional添加到方法上 不集成spring mvc也可以工作 HTTP ERROR 500 Problem accessing
  • 在面板上绘制允许自动滚动

    我正在实现一个想要在面板中画线的应用程序 但面板必须自动滚动 因为它的大小可以在运行时扩展 我使用的面板绘制方法如下 当我运行程序时 它会绘制线条 但是当我向下滚动面板时 线条会崩溃 如何避免这种情况 private void panel1
  • 如何制作模态 JFrame? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 Swing java 中制作 JFrame 模态 我有 2 个 JFrame 一个是主 JFrame 另一个是子 JFrame 我试图在显示子 JFrame 时使用户交互无法访问主 JFram
  • Apache Spark - java.lang.NoSuchMethodError:breeze.linalg.DenseVector

    我在 Play 中运行 Apache Spark 1 0 1 时遇到问题 应用程序 目前 我正在尝试在 Play 中运行 Spark 应用程序并使用 Spark 中的一些基本机器学习 这是我的应用程序创建 def sparkFactory
  • 设置默认选择列表值 Angular2

    我想将 Angular 2 中的选择的默认选项设置为 选择一个选项 这是我到目前为止的代码 HTML div class form group div
  • 在 MATLAB 中构建 3D 立方体的体素

    我想在 MATLAB 中构造一个 3D 立方体 我知道任何 3D 形状的单位都是体素而不是像素 这就是我想做的 首先 我想构造一个具有给定维度 x y 和 z 的立方体 其次 根据我从不同图像处理教程中了解到的 这个立方体必须由体素 3D像
  • 为什么 ActiveRecord 不够聪明,无法知道父亲的 object_id 应该等于其孩子的父亲的 object_id?

    father Hierarchy find first conditions gt label father father children each do child puts father object id child parent
  • 有条件地需要 jsonSchema 属性

    在 jsonSchema 中 您可以使用 required 属性指示定义的字段是否是必填的 schema http json schema org draft 04 schema type object properties header
  • 使用 CustomAction 卸载 Wix 时出现问题

    我创建了一个非常简单的 MSI 它将一些文件复制到 ProgramFiles 目录 并在安装时调用在用 C 编写的二进制文件中找到的自定义操作 安装时 我可以轻松调用我想要的任何自定义操作 例如 我创建了一个安装步骤 用户应在其中输入许可证