【发布时间】:2009-03-23 16:59:29
【问题描述】:
我有一个标准的 Visual Studio (2008) 应用程序设置项目,它会生成一个包含一些文件的 msi。但是我注意到: 1) 当 msi 安装并且一些文件已经存在时,它只是默默地忽略这些文件。这是我不想要的行为,原因很明显。 2) 当我卸载 msi 时,它不会删除我的主 dll 文件。
我该如何解决这两个问题?它们一起使我无法自动升级我的软件。
【问题讨论】:
标签: c# .net iis installation
我有一个标准的 Visual Studio (2008) 应用程序设置项目,它会生成一个包含一些文件的 msi。但是我注意到: 1) 当 msi 安装并且一些文件已经存在时,它只是默默地忽略这些文件。这是我不想要的行为,原因很明显。 2) 当我卸载 msi 时,它不会删除我的主 dll 文件。
我该如何解决这两个问题?它们一起使我无法自动升级我的软件。
【问题讨论】:
标签: c# .net iis installation
我遇到了完全相同的问题,最终放弃了。让它工作是一个可怕而复杂的过程,涉及大量的 GUID。之后你会觉得很脏(假设你曾经让它工作)。
我的建议是切换到更适合像你我这样的人的 Inno Setup。
将 .msi 留给进行“公司推广”而不是“安装”的人。
【讨论】:
您是否在安装项目中增加了版本号?增加版本号也会要求您创建一个新的产品 ID。您应该用“是”来确认这个问题。
【讨论】:
我在测试用 MSI 覆盖现有文件时遇到了类似的问题 - 现有的旧文件没有被 MSI 中的新文件替换。
我的未覆盖现有文件的新文件是版本化文件(它们是 DLL),并且文件版本号没有更改,即使修改日期较晚。一旦我将较新文件的文件版本号更改为比现有文件更高的版本,现有文件就会被 msi 覆盖。
还有其他文件,如 .manifest 和 .vsto,它们是由 Visual Studio 生成的,这些文件是无版本的,通常遵循 installer versioning 规则。这些实际上都与一个 DLL 文件相关,并且为每个 .manifest、.vsto 等文件提供一个引用该 DLL 的 CompanionFile 属性就可以了。
【讨论】:
只要不删除所有文件,请检查下面的引用计数
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs]
如果您使用过MSIZAP 又名“Windows Installer 清理实用程序”,您基本上已经将您的机器置于未知状态,您需要手动从注册表中删除所有内容(在我的公司,我们有一个实用程序在您可以再次可靠地测试您的设置之前,从该产品的最后 10 个版本中删除所有已知的注册表项,基本上由一个 1000 行的 .reg 文件和一些其他工具组成。
请参阅http://robmensching.com/blog/posts/2009/3/6/More-on-Haacks-Troubleshooting-Windows-MSI-Installers,了解更多信息,了解当您的机器进入“不受支持的状态”时会发生什么,以及在继续之前您需要如何手动清理或重新格式化。
我们遇到了这个问题,因为 Installshield 自动默认将组件设置为共享组件,所以我们最终会遇到奇怪的引用计数错误、遗留文件等等。一个非常丑陋的解决方案。
对于您的升级,请尝试进行重大升级而不是次要升级(补丁),因为当您第一次进入 Windows Installer 时,这很多更容易理解。但首先,您需要正确卸载您的应用程序,然后才能继续升级。如果不能正常卸载,就不能正常升级。
【讨论】:
另一种选择是在应用程序的安装文件夹中包含版本号。
将应用程序文件夹的默认位置设置为:
[ProgramFilesFolder]\\[ProductName]\\[ProductVersion]
还将安装项目的 RemovePreviousVersions 属性设置为 true。
这应该会删除旧版本的文件夹并为新版本创建一个新文件夹。
每次发布新版本时,请记住更改安装项目的版本属性。
【讨论】:
另一种选择是以程序方式卸载当前应用程序并安装新的 msi 但是这需要一个自定义的 winforms 应用程序
【讨论】: