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

35

我尝试创建一个自定义操作,用于修改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)添加到安装程序项目的Custom Actions的Commit部分。

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

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

在网络上搜索了一下,我找到了一些类似的经历,但是提供的解决方案都不起作用。

有什么想法吗?

11个回答

54

您可以在这里找到解决方案

引用如下:

问题在于MSI基础设施正在查找安装状态文件,该文件通常在安装阶段创建。如果自定义操作未参与安装阶段,则不会创建任何文件。

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


这不准确。你不必在两个阶段都添加任何内容。我在那个链接中添加了一个更新。在添加了“主要输出”到自定义操作的每个部分后,我只使用了Installer类中的Install覆盖。我在安装阶段的主要输出属性上设置了CustomActionData值。我在我的Installer类中完全忽略了其他阶段 - 它们不需要被覆盖,并且将执行它们一直执行的操作。在我的CustomActionData字符串中有一个文本框名称缺少闭合引号,直到我添加了它才得到与OP相同的错误。 - vapcguy

19

当我在我的安装程序项目中没有为所有四个覆盖操作(Install、Uninstall、Commit 和 Rollback)指定自定义操作时,我遇到了这个问题。当我将项目输出指定为所有四个自定义操作时,问题就消失了。

在我的安装程序类中,唯一有用的覆盖操作是 Commit 和 Uninstall;我认为 Install 负责创建 InstallState 文件,因为它从未被调用,所以 InstallState 文件从未被创建。


我在收到你的帖子后确实尝试过这个方法,但是如果我没记错的话,它并没有起作用。虽然我已经覆盖了所有4个重写(尽管其中有几个几乎没有作用),但问题仍然存在。不幸的是,我在发布一周后就放弃了这个项目(长话短说),所以我不太可能会回去报告一个解决方案。 - CJM
2
对我来说,只需将项目输出添加到“安装自定义操作”(而不是卸载或回滚)中即可解决问题。当它仅添加到“提交自定义操作”时,我遇到了错误1001。 - JimSTAT

3
有时候,为了调试,会在被重写的函数中添加"Debugger.Launch();"语句。如果你在安装程序中使用了这句话,并且在安装过程中弹出一个对话框询问是否需要进行调试,如果你选择“取消调试”,那么就会弹出错误对话框。因为你在函数中添加了"Debugger.Launch()"语句,所以安装程序会认为这个函数“丢失”。因此,请不要忘记将其移除。

在我不要脸地抄袭的代码中,调试器语句甚至没有引起弹出窗口,只是导致了“未找到InstallState”的惨败,原因不明,浪费了我几个小时的生命。 - Andre Luus
啊,我犯了这个错误。谢谢! - David
我一遍又一遍地看着这个线程,想着不可能吧,不可能是那样的......非常感谢! - MattCom

3

2
这对我来说是个问题,在自定义操作属性中,名为InstallerClass的属性被设置为True,而我需要它执行 - 所以将其更改为False就解决了我的问题。 - JasonH
我遇到了与 OP 相同的错误,但更改 InstallerClass 属性对我没有任何影响 - 无论是在我修复真正问题之前还是之后。我的真正问题是修复 CustomActionData 值中缺失的引号。 - vapcguy

1

尝试在管理员命令提示符中安装此程序。这对我有效!


0

创建您的后安装可执行文件,就像创建控制台应用程序一样,例如:"mypostinstallapp.exe"。

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

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

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

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

因此,我可以向cmd文件添加内容,并尝试忘记自定义操作过程。


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文件,以便我的应用程序在安装后使用。我将“Primary output”放置在Custom Actions GUI的所有阶段下面,但没有对InstallerClass属性(默认值:True)进行任何操作,并仅在Install上设置了CustomActionData字符串。我甚至没有在我的Installer类中包含覆盖函数,因为在其他阶段中我没有做任何自定义的事情。


0

您可以将注册表键设置为安装路径。单击“设置项目”,查看注册表,并将值设置为:[ProgramFiles64Folder] [Manufacturer] [ProductName]。

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


0
确保在输出属性中将安装程序类设置为false。

enter image description here


0
在我的情况下,我想运行一个第三方exe文件,我需要在自定义操作“安装”和“提交”期间加载相同的exe文件,并将安装程序类属性设置为“TRUE”,这样您就不必将其导入为主要输出。希望这能帮助其他人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接