【问题标题】:Visual Studio 2008 Installer Project - Custom Actions not firingVisual Studio 2008 安装程序项目 - 自定义操作未触发
【发布时间】:2023-03-29 15:53:01
【问题描述】:

我似乎无法让自定义操作生效。我可能做错了。这是我正在尝试做的事情:

我想在我的应用程序安装(Visual Studio 安装程序项目)中运行一个运行可执行文件的自定义操作。可执行文件只是执行一些 system.io 文件复制任务,并且我已经确认该可执行文件在单独运行时可以完美运行。

  1. 我创建了安装程序项目
  2. 将 exe 添加到应用程序文件夹中
  3. 进行自定义操作并将 exe 添加到提交步骤
  4. InstallerClass 设置为 true
  5. 运行安装程序,没有得到我希望的结果。所以我添加了一行写入 Windows 日志。再次运行安装程序后查看 Windows 日志,看起来它没有运行。在 exe 代码中添加了 debug.break 取消安装/重新安装了我的安装程序,但什么也没发生。我终于坐下来观看了这些过程,并确认 exe 永远不会被执行。

有什么想法吗?

目标系统:Windows XP、Vista Visual Studio 版本:2008 Sp1 语言:VB.NET 目标框架:2.0


非常好。由于您发布的代码,我想我越来越近了。我将其转换为 VB,但出现此错误:找不到 myexename.savedstate。我想我应该向您发布的潜艇传递一些东西,但我不知道是什么。 (顺便说一下,这是一个控制台应用程序)我添加了对 System.Configuration.Install.dll 的引用,这是我的代码:

导入 System.ComponentModel 导入 System.Configuration.Install _ 公共类ApplicationInstaller 继承安装程序 公共重载覆盖 Sub Commit(ByVal savedState As IDictionary) ' 在提交上做一些工作 The_Sub_I_Want_To_Run() 结束子 公共重载覆盖子安装(ByVal stateSaver As IDictionary) ' 做一些安装工作 结束子 公共重载覆盖子卸载(ByVal savedState As IDictionary) ' 做一些卸载工作 结束子 结束类

我没有这么称呼。我以前从未使用过 Installer 类。我可能在这里做一些非常菜鸟的事情。根据您的指示,我已将粘贴在下面的代码添加到我要在安装期间运行的 exe 中。我将 exe 添加到我的应用程序文件夹中,然后将其添加到提交自定义操作中。现在这是我现在尝试运行的 exe 源代码中的代码:

_ 公共类ApplicationInstaller 继承安装程序 公共重载覆盖 Sub Commit(ByVal savedState As IDictionary) ' 在提交上做一些工作 The_Sub_I_Have_my_codein() MyBase.Commit(savedState) 结束子 公共重载覆盖子安装(ByVal stateSaver As IDictionary) ' 做一些安装工作 结束子 公共重载覆盖子卸载(ByVal savedState As IDictionary) ' 做一些卸载工作 结束子 结束类

嗯...在 exe 的项目属性中,我单击了“签署程序集”,错误消失了。但是,看起来 exe 没有运行我想要的代码。

【问题讨论】:

  • Visual Studio 部署项目很糟糕,无疑会给您带来问题。改用 WiX。

标签: windows visual-studio visual-studio-2008 windows-installer


【解决方案1】:

您要添加到 Commit 步骤的 exe 或库应包含一个派生自 Installer 的类,并标有 RunInstaller 属性,如下所示:

[RunInstaller(true)]
public class ApplicationInstaller : Installer
{
    public override void Commit(IDictionary savedState) {
      // Do some work on commit
    }
    public override void Install(IDictionary stateSaver) {
      // Do some work on install
    }
    public override void Uninstall(IDictionary savedState) {
      // Do some work on uninstall
    }
}

希望这会有所帮助。

【讨论】:

  • [RunInstaller(true)] 很重要。
【解决方案2】:

你是在调用基础方法吗?

public override void Commit(IDictionary savedState) {
    // Do some work on commit
    base.Commit(savedState);
}

【讨论】:

    【解决方案3】:

    设置

    InstallerClass
    属性为“假”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 2011-09-06
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多