我有一个 C# .NET 项目和一个 VS 安装项目来安装它。在 C# .NET 项目中,我有 System.Configuration.Install.Installer 子类。Installer 子类需要在“c:\Program Files (x86)\AppName”文件夹中写入一个文件,该文件将包含安装程序中要求的参数的内容。在用户决定注销并且另一个用户登录之前,这一切都很好。然后文件消失,程序不工作。我需要将该文件永久保存在应用程序的 Program Files (x86) 文件夹中,并且不应将其删除。
我读到这与 Windows Vista 有关,后来有一个称为程序文件虚拟存储的东西,但我不明白如何绕过它,所以我可以真正将文件放在那里。在大多数情况下,存储在此目录中是不正确的,但在这种情况下,我确实需要。这是在安装程序中进行的设置,应该在那里。这是正确的地方。
下面是Installer类的代码
编辑:现在我发现了一些我以前没有注意到的东西。好像当我登录到其他用户时,安装程序在 login 后立即再次执行,但这次没有 Context.Parameters["ActivationCode"] 。这是预期的吗?什么是实际启动安装程序?它对每个用户都这样做吗?由于它失败了,我猜它会回滚并删除文件。
public partial class ProjectInstaller : System.Configuration.Install.Installer {
public ProjectInstaller() {
InitializeComponent();
}
public override void Install(IDictionary stateSaver) {
base.Install(stateSaver);
if (string.IsNullOrWhiteSpace(Context.Parameters["ActivationCode"])) {
throw new InstallException("Missing activation code!");
}
string installDir = Path.GetDirectoryName(Context.Parameters["assemblypath"]);
File.WriteAllText(installDir + "\\ActivationCode.txt", Context.Parameters["ActivationCode"]);
}
public override void Uninstall(IDictionary savedState) {
base.Uninstall(savedState);
try {
string installDir = Path.GetDirectoryName(Context.Parameters["assemblypath"]);
File.Delete(installDir + "\\ActivationCode.txt");
}
catch (Exception) {
}
}
public override void Rollback(IDictionary savedState) {
base.Rollback(savedState);
try {
string installDir = Path.GetDirectoryName(Context.Parameters["assemblypath"]);
File.Delete(installDir + "\\ActivationCode.txt");
}
catch (Exception) {
}
}
}