1

我们有一个 MSI 可以在客户端机器上安装 windows 服务。Windows 服务调用我们服务器的 Web 服务来执行操作。最初,MSI 和 Web 服务都是使用 .NET 2.0 框架构建的。

上个季度,我们将系统升级到 .NET 4.0。虽然我们的 Web 服务仍然是 ASP.NET,即 asmx(而不是 WCF)。此外,我确实将框架 4.0 设置为安装 MSI 的先决条件。

我们的一位客户报告了这个问题:

客户使用 .NET 框架 2.0,并在他的系统中安装了旧版本的 MSI。当他尝试安装.NET framework 4.0版本的微星时,被提示安装framework 4.0(因为有先决条件)。框架安装完成后,他尝试安装 MSI 并收到此错误。有人可以指导我解决问题。如果需要,我可以提供详细信息。

升级到 4.0 MSI 时出错

编辑1:

经过更多研究,我发现它是我的 AppName.installstate 文件。卸载会删除此文件,但升级不会这样做。该文件位于安装目录中。仔细一看,我可以在文件内容中看到“ http://schemas.xmlsoap.org/soap/envelope/:Envelope ”。任何指针将不胜感激。

编辑2:

自定义操作 Install 创建 AppName.installstate 文件,自定义操作 Uninstall 删除该文件。就我而言,我正在进行 MSI 升级,但对这个文件没有任何作用。当我比较 2.0 和 4.0 的 installstate 文件(都是手动安装的)时,我可以看到 XML 语法、模式和内容的巨大差异,原因是我收到了序列化错误。现在我需要知道为什么 AppName.installstate 在升级时没有被覆盖。做了很多谷歌,但无处可去。查看了 MSI 安装日志,但没有有用的信息。

4

2 回答 2

1

尤里卡!!!!

我找到了解决我的问题的方法。

问题的根本原因: MSI 在安装过程中生成一个 XML 文件 ( application_name.installstate),其中存储了 MSI 在安装、卸载、回滚过程中使用的信息。此 XML 文件的格式在 .NET 2.0 和 .NET 4.0 之间完全不同,即使用 VS2005 和 VS2010 开发的 MSI。由于 4.0 frmaework 无法理解旧框架版本 (2.0) 生成的文件,我们收到错误消息“无法序列化 Installstate 文件的类型”。虽然没有可用的在线文档,但我发现了这个讨论 > http://social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/bedbb8bd-dad5-4bcb-a87a-ac69386669b4/

我尝试过的解决方案(我称之为解决方法):在安装新版本期间,我明确地将旧的 XML 文件替换为新格式(4.0)。即我application_Name.installstate在我的包中包含了文件(由新版本生成),所以它在升级时覆盖了旧文件。MSI 安装没有任何错误,并且运行成功。

如果有人需要有关问题和解决方案的详细信息,请在此处回复。

于 2012-03-14T13:34:03.337 回答
-1

根据 1001 错误消息,此错误消息与安装程序无关。问题完全在您的服务内部。

您的服务的 OnStart 方法应该什么都不做,只是启动一个后台进程并尽快将成功启动返回给服务控制管理器。在该关键路径中不应该有任何长时间运行的代码,因为 SCM 在假设启动服务时出现错误之前只会等待很长时间。

重构您的服务以在另一个线程上运行作业,安装将成功安装。从那里您可以专注于反序列化过程中发生的真正问题。

于 2012-02-15T14:01:35.817 回答