【问题标题】:MSI Installer cannot find InstallState when using custom action with parameters使用带参数的自定义操作时,MSI 安装程序找不到 InstallState
【发布时间】:2011-02-15 19:41:16
【问题描述】:

首先,是的,我知道 VS 安装项目是邪恶的。这是我必须处理的。我也看到了几个相关的问题,但它们要么没有得到回答,要么与我的情况不够接近,无法得到答案(或者他们喋喋不休地谈论 VS 设置项目的弊端和 WiX 的奇迹)。

我的应用程序有一个安装项目。复制文件效果很好,但是复制文件后我需要执行两个自定义操作。我创建了一个安装程序类并将其设置为安装项目中的自定义操作,它的骨架(没有工作,只是显示一个对话框,以便我可以附加调试器并环顾四周)工作得很好。然后,我发现我需要将参数从 MSI 传递给我的自定义操作,以便我可以通过安装程序类的 Context 属性访问它们。

这是安装程序类的当前代码(一些名称已更改以保护无辜者)。它基本上什么都不做,只是在正确的时间显示一个对话框(在复制文件之后但在提交安装之前):

namespace MyApp.Install.CustomSetup
{
    [RunInstaller(true)]
    public partial class MyAppCustomInstallActions : System.Configuration.Install.Installer
    {
        public MyAppCustomInstallActions()
        {
            InitializeComponent();
        }

        protected override void OnAfterInstall(IDictionary savedState)
        {
            try
            {
                base.OnAfterInstall(savedState);
                if (MessageBox.Show(
                    "Custom Action OnAfterInstall successfully integrated. You can attach a debugger if desired. Do you wish to perform the custom actions?",
                    "DEBUG", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;

                SetEditablePermissionOnFolder(savedState);
                SetApplicationSettingsFromWizard(savedState);
            }
            catch (Exception ex)
            {
                Context.LogMessage(ex.ToString());
                throw;
            }
        }

        private void SetApplicationSettingsFromWizard(IDictionary savedState)
        { 
            //TODO: Implement
        }

        private void SetEditablePermissionOnViewerFolder(IDictionary savedState)
        {
            //TODO: Implement
        }
    }
}

计划是让自定义操作生效,然后取出对话框并执行此操作。

这是安装项目自定义操作的安装操作的 CustomActionData 字符串:

/phonenumber=[phonenumber] /thirdpartyinstallpath1="[thirdpartyinstallpath1]\" /thirdpartyinstallpath2="[thirdpartyinstallpath2]\" /thirdpartyinstallpath3="[thirdpartyinstallpath3]\"

如果我不使用这个参数字符串也可以,但是我没有参数。如果我确实指定了这个字符串,安装程序会在我自己的对话框出现之前失败,出现两个错误:"Exception occurred while initializing the installation: Could not load file or assembly 'file:///C:\Windows\SysWOW64\Files' or one of its dependencies. The system cannot find the file specified""Error 1001. Could not find file C:\Program Files (x86)\MyCompany\MyApp\MyApp.Install.CustomSetup.InstallState"

我做错了什么?我做错什么了吗?是否有不需要我使用其他框架重新创建安装程序的解决方案?

编辑:我发现删除除电话号码参数之外的所有内容并将 [PHONENUMBER] 放在引号中,可以传递该参数。但是,我不能通过任何目录路径;我用 [INSTALLDIR] 尝试了几个博客和演练中所说的那样做,没有骰子。

【问题讨论】:

  • 必须说,VS Setup 项目最适合我,不仅仅是公司、产品数量等等。注意事项?当然,但即使是经过验证的科学也随之而来,我也每天都过着自己的生活。
  • .InstallState 文件在我使用“设置”模板时也丢失了,切换到“设置向导”模板时,.InstallState 文件将不再丢失。完成“设置向导”后,我仍然可以自定义项目,因为它是使用“设置”创建的。

标签: c# .net installation custom-action


【解决方案1】:

我遇到了类似的问题并通过以下方式解决了它:

在自定义操作的属性上,将 InstallerClass 设置为 false。

【讨论】:

  • 这解决了问题。谢谢
【解决方案2】:

我发现问题出在参数字符串的格式上。因为各种参数(尽管它们是文件路径)包含文件名而不是以反斜杠结尾,所以我不需要尾随反斜杠来结束这些值字符串。因为无论如何我都这样做了,所以结束引号被视为字符串的一部分,这使得解析器使用下一个开始引号作为前一个值的结尾,从而破坏了整个参数字符串。因此,InstallState 无法正确写入,并且在自定义安装逻辑尝试使用它时失败。

【讨论】:

    【解决方案3】:

    如果有人在从 VS2008 升级到 VS2010 后遇到此错误,请查看此线程: http://social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/829d5c90-9a0d-4258-9d4d-1341cc50f95b/

    这为我解决了这个问题:

    在设置项目属性上将“BackwardCompatibleIDGeneration”更改为 true。

    【讨论】:

    • 从 VS2005 升级到 VS2010 时也可以使用此解决方案
    【解决方案4】:

    我要确保的一件事是我的路径已正确逃脱;要么这样做

    @"My Documents\Blah"
    

    "My\ Documents\\Blah"
    

    【讨论】:

    • 这是个问题;事实证明,因为我需要的路径([TARGETDIR] 除外)包含一个可执行名称,所以我不必使用尾部反斜杠(正确的格式是 "[ExecutablePath]",而不是 "[ExecutablePath]\")。因为我这样做了,所以结束引号被视为变量的一部分,破坏了参数字符串的其余部分。
    【解决方案5】:

    问题是终止引号前面的反斜杠将被解释为属于字符串的引号,并且不会终止字符串。 在 CustomactionActionData 字符串中

    /thirdpartyinstallpath1="[thirdpartyinstallpath1]\" /thirdpartyinstallpath2="[thirdpartyinstallpath2]\"
    

    安装程序通过用户输入替换 [thirdpartyinstallpath1][thirdpartyinstallpath2],然后尝试解释 CustomactionActionData 字符串。 如果“thirdpartyinstallpath1”的用户输入是“C:\Test\”,则上面的 CustomactionActionData 字符串可能没问题,但如果用户输入“C:\Test”,则安装失败并出现错误

    “初始化安装时发生异常:无法 加载文件或程序集 'file:///C:\Windows\SysWOW64\Files...' 或一个 它的依赖项...”

    使用 CustomactionActionData 字符串,如

    /thirdpartyinstallpath1="[thirdpartyinstallpath1]" /thirdpartyinstallpath2="[thirdpartyinstallpath2]"

    如果用户输入是“C:\Test\”,安装程序将失败。如果用户输入是“C:\Test”,这将是可以的。但你永远无法知道用户会做什么。

    我的解决方法是在终止字符串之前是一个空白,如下所示:

    /thirdpartyinstallpath1="[thirdpartyinstallpath1] " /thirdpartyinstallpath2="[thirdpartyinstallpath2] "

    所以没有改变通过用户输入删除终止字符串。 在代码中,您可以通过 Trim 从用户输入中删除所有前导和尾随空白字符

    【讨论】:

      【解决方案6】:

      在我的情况下,这是因为我错误地将自定义操作添加到回滚节点而不是安装节点。简单的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多