自定义操作 - 错误1001:找不到文件myApp.InstallState

时间:2011-11-09 10:16:33

标签: c# windows-installer custom-action

我尝试为Visual Studio Installer项目创建自定义操作,以修改配置文件的权限。

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);
}

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

运行安装程序时,出现以下错误:

Error 1001: Could not find file 'c:\mypath\myapp.InstallState'
在网上搜索我发现了一些类似经历的例子,但所提供的解决方案都没有对我有用。

有什么想法吗?

9 个答案:

答案 0 :(得分:47)

You can find a solution here

引用:

  

问题是MSI基础结构正在查找通常在安装期间创建的安装状态文件   相。如果自定义操作未参与安装阶段,   没有创建文件。

     

解决方案是将自定义操作添加到Install和   提交阶段,但在安装阶段没有任何作用。

答案 1 :(得分:15)

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

我的安装程序类中唯一可以执行任何操作的覆盖是提交和卸载;我认为Install首先负责创建InstallState文件,因为从未调用过,所以从未创建过InstallState文件。

答案 2 :(得分:3)

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

确保自定义操作符合教程建议。

答案 3 :(得分:3)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

对我来说,问题就像在CustomActionData字符串中的一个文本框名称周围添加一个结束引号一样简单。

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

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

应该是:

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

(关于[EDITB1]的报价)

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

答案 7 :(得分:0)

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

使用您的msi产品安装“ mypostinstallapp.exe”。如果要多次安装,可以将其放在“应用程序文件夹”或共享文件夹中。

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

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

我在“ mypostinstallapp.exe”中执行的操作是查找cmd文件并将其作为进程运行。

所以我可以将内容添加到cmd文件中,并尝试忘记自定义操作过程。

答案 8 :(得分:0)

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

enter image description here