我尝试为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'
在网上搜索我发现了一些类似经历的例子,但所提供的解决方案都没有对我有用。
有什么想法吗?
答案 0 :(得分:47)
引用:
问题是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个框,EDITB1
和EDITB2
,用于某些数据库参数。我的 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)