【问题标题】:Custom Action - Error 1001: Could not find file myApp.InstallState自定义操作 - 错误 1001:找不到文件 myApp.InstallState
【发布时间】:2011-12-25 04:43:01
【问题描述】:

我已尝试为 Visual Studio 安装程序项目创建自定义操作以修改配置文件的权限。

Installer.cs如下:

public override void Commit(IDictionary savedState)
{
    base.Commit(savedState);

    // Get path of our installation (e.g. TARGETDIR)
    //string configPath = System.IO.Path.GetDirectoryName(Context.Parameters["AssemblyPath"]) + @"\config.xml";
    string configPath = @"C:\Program Files\Blueberry\Serial Number Reservation\config.xml";

    // Get a FileSecurity object that represents the current security settings.
    FileSecurity fSecurity = File.GetAccessControl(configPath);

    //Get SID for 'Everyone' - WellKnownSidType works in non-english systems
    SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);

    // Add the FileSystemAccessRule to the security settings.
    fSecurity.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));

    // Set the new access settings.
    File.SetAccessControl(configPath, fSecurity);

}

public override void Install(IDictionary stateSaver)
{
    base.Install(stateSaver);
}

public override void Rollback(IDictionary savedState)
{
    base.Rollback(savedState);
}

public override void Uninstall(IDictionary savedState)
{
    base.Uninstall(savedState);
}

然后我将主输出(安装程序 class= true)添加到安装项目的自定义操作的提交部分。

当我运行安装程序时,我收到以下错误:

Error 1001: Could not find file 'c:\mypath\myapp.InstallState'

在网上搜索我发现了一些类似经历的例子,但所提供的解决方案都不适合我。

有什么想法吗?

【问题讨论】:

    标签: c# windows-installer custom-action


    【解决方案1】:

    您可以为安装路径设置一个注册密钥。点击 Setup Project,View Register,并将值设置为:[ProgramFiles64Folder][Manufacturer][ProductName]。

    然后您可以创建一个控制台应用程序以进入注册表并获取此信息并运行您的程序。只需在提交您创建的控制台应用程序上添加自定义操作即可。

    【讨论】:

      【解决方案2】:

      确保在输出属性中将安装程序类检查为 false

      【讨论】:

        【解决方案3】:

        像创建控制台应用程序一样创建安装后可执行文件:“mypostinstallapp.exe”。

        在您的 msi 产品中安装“mypostinstallapp.exe”。如果您想在多个安装中使用它,可以将它与应用程序文件夹或共享文件夹一起使用。

        在自定义操作中(右键单击 msi 项目并查看自定义操作)并在“提交”部分添加一个操作。假设您希望它运行到最后。

        然后从操作视图中选择您的“mypostinstallapp.exe”,并在其属性中设置 InstallerClass False。

        我在“mypostinstallapp.exe”中所做的是寻找一个 cmd 文件并将其作为进程运行。

        这样我就可以在 cmd 文件中添加内容并尝试忘记自定义操作过程。

        【讨论】:

          【解决方案4】:

          对我来说,问题很简单,只需在我的 CustomActionData 字符串中的一个文本框名称周围添加一个右引号。

          我在用户界面部分使用“文本框 (A)”和“文本框 (B)”窗口。 A 有 1 个框,EDITA1,用于获取文件的路径,B 有 2 个框,EDITB1EDITB2,用于某些数据库参数。我的 CustomActionData 字符串如下所示:

          /filepath="[EDITA1]" /host="[EDITB1] /port="[EDITB2]" 
          

          应该是:

          /filepath="[EDITA1]" /host="[EDITB1]" /port="[EDITB2]" 
          

          [EDITB1] 的结束语)

          我在我的安装程序类中使用安装覆盖来获取值(即string filepath = Context.Parameters["filepath"];)并使用它将它们写入 INI 文件,以便我的应用在安装后使用。我将“主要输出”放在自定义操作 GUI 的所有阶段下,但没有对 InstallerClass 属性执行任何操作(默认值:True),只设置了 CustomActionData 字符串在安装一个。我什至没有在我的 Installer 类中包含覆盖函数,因为我没有做任何其他阶段的自定义操作。

          【讨论】:

            【解决方案5】:

            尝试在自定义操作的属性中设置 Installer class= false 而不是 true。这为我解决了这个问题。

            【讨论】:

            • 1.不够具体(哪个阶段?您是否在您设置为 false 的阶段的安装程序类中包含事件/覆盖功能?) 2. 我会说这必须是某种边缘情况,因为它不适用于我,我的所有(每个阶段)都设置为 True 没有问题。
            【解决方案6】:

            尝试在管理员命令提示符下安装它。这对我有用。!

            【讨论】:

              【解决方案7】:

              有时,“Debugger.Launch();”放在那些被覆盖的函数处进行调试。如果您使用那里的语句构建安装程序,并且在安装过程中,将弹出一个对话框询问您是否需要调试,如果您按“取消调试”,您将收到此错误对话框。因为您在函数中添加了“Debugger.Launch()”,所以该函数将被安装程序视为“错过”。所以,不要忘记删除它。

              【讨论】:

              • 我厚颜无耻地复制的代码中的调试器语句甚至没有导致弹出窗口,只是一个导致“找不到安装状态”的悲惨失败,无缘无故浪费了我几个小时的生命。
              • 啊,我犯了这个错误。谢谢!
              • 在这里我一遍又一遍地看这个线程;没想到,不可能……非常感谢!
              【解决方案8】:

              You can find a solution here

              引用:

              问题在于 MSI 基础架构正在寻找通常在安装过程中创建的安装状态文件 阶段。如果自定义操作不参与安装阶段, 没有创建文件。

              解决方案是将自定义操作添加到安装和 提交阶段,尽管它在安装阶段什么都不做。

              【讨论】:

              • 这不准确。您不必在这两个阶段中添加任何内容。我在该链接上添加了更新。在将“主要输出”添加到自定义操作中的每个部分之后,我只在安装程序类中使用了安装覆盖。我在安装阶段主要输出属性上设置了我的 CustomActionData 值。我在我的 Installer 类中完全忽略了其他阶段——它们不需要被覆盖,只会做他们一直做的事情。在我在缺少的 CustomActionData 字符串中的一个文本框名称周围添加了一个右引号之前,我遇到了与 OP 相同的错误。
              【解决方案9】:

              当我没有在我的安装程序项目中为所有四个覆盖(安装、卸载、提交和回滚)指定自定义操作时,我遇到了这个问题。一旦我将我的项目输出指定为所有四个的自定义操作,问题就消失了。

              我的安装程序类中唯一能做任何事情的覆盖是提交和卸载;我认为 Install 首先负责创建 InstallState 文件,并且由于它从未被调用过,因此从未创建过 InstallState 文件。

              【讨论】:

              • 当我收到你的帖子时,我确实尝试过这个,但是 IIRC 它没有用。我已经覆盖了所有 4 个覆盖(尽管有几个做得很少),但问题仍然存在。不幸的是,我在发布大约一周后放弃了这个项目(长篇故事),所以我不太可能回去报告解决方案。
              • 为我工作只是将项目输出添加到安装自定义操作(不是卸载或回滚)。仅将其添加到提交自定义操作时,我收到了错误 1001。
              【解决方案10】:

              当安装程序类未正确创建时,有时会发生这种情况。这是一个可以帮助你的教程:http://devcity.net/Articles/339/1/article.aspx

              确保您的自定义操作遵循教程建议。

              【讨论】:

              • 对我来说就是这种情况,在自定义操作属性中,名为 InstallerClass 的属性设置为 True,当我需要它执行时 - 所以将其更改为 False 对我有用。
              • 如果 OP 出现错误并且更改 InstallerClass 属性对我来说没有任何效果 - 无论是在我修复了我的真正问题之前还是之后 - 这是修复了我的 CustomActionData 值中缺少的引号。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-25
              相关资源
              最近更新 更多