1

クライアント マシンに Windows サービスをインストールするための MSI があります。Windows サービスは、当社サーバーの Web サービスを呼び出して操作を実行します。最初は、MSI と Web サービスの両方が .NET 2.0 フレームワークを使用して構築されました。

前四半期に、システムを .NET 4.0 にアップグレードしました。私たちのWebサービスはまだASP.NET、つまりasmxです(WCFではありません)。また、MSI をインストールするための前提条件としてフレームワーク 4.0 を設定しました。

クライアントの 1 人がこの問題を報告しました。

クライアントは .NET Framework 2.0 を使用しており、古いバージョンの MSI がシステムにインストールされていました。MSI の .NET Framework 4.0 バージョンをインストールしようとすると、(前提条件のため) Framework 4.0 をインストールするように求められました。フレームワークのインストールが完了したら、MSI をインストールしようとしたところ、このエラーが発生しました。誰かが解決策を教えてください。必要に応じて詳細を提供できます。

4.0 MSI へのアップグレード中のエラー

編集1:

さらに調査したところ、それが私の AppName.installstate ファイルであることがわかりました。アンインストールするとこのファイルが削除されますが、アップグレードでは削除されません。ファイルはインストール ディレクトリにあります。よく見ると、ファイルの内容に「 http://schemas.xmlsoap.org/soap/envelope/:Envelope 」が表示されます。どんなポインタでも大歓迎です。

編集2:

カスタム アクション インストールは AppName.installstate ファイルを作成し、カスタム アクション アンインストールはファイルを削除します。私の場合、このファイルには何もしない 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 フレームワークは古いフレームワーク バージョン (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 は、サービスの開始時にエラーが発生したと想定するまでに長時間待機するだけなので、そのクリティカル パスに長時間実行されるコードがあってはなりません。

別のスレッドでジョブを実行するようにサービスをリファクタリングすると、インストールは正常にインストールされます。そこから、DeSerialization プロセスで何が起こっているかという実際の問題に集中できます。

于 2012-02-15T14:01:35.817 に答える