【问题标题】:When uninstalling a windows service with a x64 installer , Environment.SpecialFolder.ProgramFiles returns "Program Files (x86)"使用 x64 安装程序卸载 Windows 服务时,Environment.SpecialFolder.ProgramFiles 返回“Program Files (x86)”
【发布时间】:2019-03-26 11:57:51
【问题描述】:

我为 C# windows 服务编写了 x64 windows 安装程序。 Windows 服务本身以任何 CPU 为目标。它将服务正确安装到“程序文件”。但是,卸载时,我需要删除日志目录。但是当我尝试使用 Environment 获取“程序文件”的路径时,它返回“程序文件(x86)”,因此无法找到日志目录并将其删除。我该如何解决这个问题。代码运行在 ProjectInstaller 类中,如下

   try
    {
                    string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + @"\PathToLogsFolder"; 
logger.Info(path);
//The above line always shows Program Files (x86) instead of "Program Files"
    if (Directory.Exists(path))
    {

       Directory.Delete(path, true);

    }
    else
    {
      logger.Info("Path does not exist:"+path);
    }                
    }
    catch (Exception e)
    {
     logger.Error("Failed to delete Logs directory on uninstall:" + e.Message);
     logger.Error(e.StackTrace);
    }

【问题讨论】:

  • 你用的是什么工具?您应该能够使用 MSI 中的内置 RemoveFile 表删除文件。然后根本没有代码可写。此外,我更喜欢在卸载期间不删除日志文件,而是向用户记录如何清理或更好地记录到系统的事件日志而不是文件。如果您愿意,您可以在调试模式下登录到文件,但对于发布二进制文件不行吗?
  • 谢谢斯坦。我正在使用适用于 VS 2017 的 Windows 安装程序插件。你是对的,我应该使用 RemoveFile 表。我还在卸载期间将消息写入系统事件日志,这就是我认为我得到“程序文件(x86)”而不是“程序文件”的方式。日志文件包含以前运行的信息,我无法将所有内容都放在系统事件日志中,因此我使用日志文件。但是,如果可能的话,我仍然希望解决这个问题。但我一定会查看 RemoveFiles 表

标签: c# windows-installer program-files


【解决方案1】:

最可能的解释是您的代码是作为 32 位代码运行的,而不是作为本机 64 位代码运行的。您有一个 64 位的安装程序,但这并不意味着您的所有代码都将运行 64 位。您没有明确说明这一点,但如果该删除代码在自定义操作中,则将该代码明确构建为 64 位,并且与服务相同。

【讨论】:

  • 谢谢菲尔。该代码在 Windows 服务中运行,该服务以“任何 CPU”为目标。由于某种原因,我无法在 Windows 10 上运行 x64 服务。它不应该以 64 位运行,因为操作系统是 64 位
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多