2016-08-18 10 views
1

私は、いくつかのMSIをインストールするWiX Managed Bootstrapperアプリケーションを持っています。また、インストーラのさまざまな機能を実行する一連のテストもあります。私が抱えている問題は修復テストです。テストで意図的にインストールしたすべてのDLLが破損し、 "/ repair/passive"フラグを付けてEXEインストーラが呼び出されます。完了したDLLの約80%が修復されますが、残りのDLLは修復後も変更されずに破損しています。管理されたブートストラップからのWiX修復が、一部の破損したDLLの修復に失敗します。

インストールされているすべてのファイルを強制的に置き換えるようにMSIに指示するコマンドライン引数 "/ fa"を使用して個々のMSIで手動でmsiexecを実行すると、100%のDLLが修正されます。

私の質問はどのように私はこのように修復するには、各MSIを指示するMBAを強制することができますか?私は彼らの.wxsファイル内の個々のMSIの「amus」にREINSTALLMODEプロパティを設定しようとしましたが、このラインを介してログに明らかなようにMBAは、実行時にそれらを上書き:

PROPERTY CHANGE: Modifying REINSTALLMODE property. Its current value is 'amus'. Its new value: 'cmuse'.

私は」また、各MSIに渡すためにMBAのプロパティを設定しようとしましたが、それらを渡すように見えず、その代わりにデフォルト値が使用されます。

多くの類似の質問がありますが、実際にこの特定の問題に対処するものはありません。どんな助けでも大歓迎です。ロブは私を救う!

+0

msiインストーラのログは、交換されていない? –

+0

オペレーションの実行:ComponentRegister(ComponentId = {0B2B6D28-A32F-4BE8-B990-8DB2A4A790AA}、KeyPath = C:¥****¥estimator.dll、State = 3、ディスク= 1、SharedDllRefCount = 0、BinaryType = 1 ) –

+0

オペレーションの実行:FileCopy(SourceName = ksncnr0g.dll | estimator.dll、SourceCabKey = fil46DA9182A232003B1FD10E3DF65EF686、DestName = estimator.dll、Attributes = 512、FileSize = 2220032、PerTick = 65536、VerifyMedia = 1 ,,,,, CheckCRC = 0、InstallMode = 59244544、HashOptions = 0、HashPart1 = -1917773179、HashPart2 = -1616579533、HashPart3 = -79796171、HashPart4 = -1442608125 ,,) MSI(A0:34)[12:25:25 :874]:ファイル:C:\ **** \ estimator.dll; \t上書きしません。 \tパッチは適用されません。 \t既存ファイルのバージョンは変更されていませんが、変更されました –

答えて

1

ここにあなたの問題はここです:

[12:25:25:874]: File: C:****\estimator.dll; Won't Overwrite; Won't patch; Existing file is unversioned but modified 

インストーラがバージョンや言語確認できない場合は、それがインストールされてから変更されたファイル上書きしたくない(そしておそらく他のいくつかのプロパティを?) 。これらのプロパティがなければ、変更された日付を調べることにします。それが最初にインストールされたときよりも新しい場合は、何らかの理由で変更されたものを元に戻し、元に戻すと何かが失敗すると仮定して、それに触れません。あなたは、この場合に行うことができます

ことの一つは、使用し、このファイルに別のファイルの仲間の子を作るために、この属性を設定します。Companion File

です(あなたはhere詳細を読むことができます)コンパニオンファイルのインストール状態は、それ自身のファイルバージョン情報に依存するのではなく、コンパニオン親のバージョニングに依存します。コンポーネントのキーパスであるファイルは、コンパニオンファイルにすることはできません(つまり、このファイルに対してKeyPath = "yes"の場合、この属性を設定できません)。コンパニオンファイルは、独自のバージョンに基づいてインストールされていないため、この属性とともにVersion属性を設定することはできません。

基本的には、このコンポーネントのインストール/アンインストールのロジックを、インストール中の別のコンポーネントの「FileID」と同じに設定します。 estimateator.dllコンポーネントのFileタグでKeyPath="yes"を削除し、代わりにCompanionFile="<NameOfAnotherFileID>"に置き換えます。このアプローチの

問題は、それはそれは再インストールされていないので、大丈夫だったにリンクされていた、破損したDLLが、companionFileを持っているかもしれないということです。

これはあなたが所有しないDLLであれば、私は非常にファイルをバージョン管理を示唆しています!あなたが望む任意のバージョンを与えると、この問題はなくなるはずです。私はそれが実際にどのように動作するか分かりませんが

あなたが試すことができますもう一つは、これは、このファイルのデフォルトバージョンである

ファイルにDefaultVersionを与えています。抑制ファイルオプションが使用されていない場合、リンカーはファイルの値からこの値を置き換えます。

これは検証するための最も簡単な解決方法です。 estimator.dllの<File>DefaultVersion="1.0"という新しいインストーラを作成し、置き換えられるかどうか確認してください。私はこれがインストーラにバージョン1.0のファイルだと思うでしょうが、インストールされたファイルはバージョンがないので置き換えられます(here参照)

+0

ありがとう、これは素晴らしいです!残念ながら私はこれらのDLLをすべて所有しているわけではありません。長期目標は、すべてがバージョン化されていることを確認することです。おそらく数ヶ月かかるでしょう。その間、REINSTALLMODEのデフォルト値 'cmuse'を上書きせずに変更できるかどうかは分かりますか?それは良い一時的な修正だろう。 –

+0

変更することはできますが、エンジンのコードを変更してビルドする必要があります。カスタムburn.exeを生成するには、ビルドする必要があります。私は動作する可能性のある別の解決策は、InstallInitializeの後にそれらが置き換えられる強制的に、修復中にバージョン管理されていないDLL(InstalledとREINSTALLMODE〜= "cmuse")を削除するカスタムアクションを作成することだと思います。しかし、並べ替えのハック。 (InstallValidateの前に移動しなければならないかもしれませんが、実際にコンポーネントをインストールするかどうかはわかりません) –

+0

'DefaultVersion'タグを試してみましたか? –

関連する問題