3

前回の質問に続いて、WiXカスタムアクションがSystem.IO.FileNotFoundExceptionをスローするのはなぜですか?、現在、msiの一部としてC++ディストリビュータブルをインストールしようとしています。

ドキュメントに従って例に従いました。http://wix.sourceforge.net/manual-wix3/install_vcredist.htm

<DirectoryRef Id="TARGETDIR">
      <Merge Id="VC_Redist" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_CRT_x86.msm" DiskId="1" Language="0"/>
    </DirectoryRef>

    <Feature Id="Complete" Level="1" Title="$(var.NVRProduct) $(var.NVRVersion)" Description="Everything" Display="expand">
      <Feature Id="VC_Redist" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1">
        <MergeRef Id="VC_Redist"/>
      </Feature>      
    </Feature>

それは動作しません。C ++ディストリビューターがインストールされていません。その後、C ++ディストリビューションが見つからないため、msiがエラーをスローし、それ自体をアンインストールします。

これは、実際には答えられなかったこの質問と同じようです。 WIXを使用したC++再配布可能パッケージ

どんなアイデアでもありがたいです。

4

2 に答える 2

3

さらなる調査の結果、多くの問題が見つかったので、私自身の質問に答えるつもりです。

まず、VC ++マージモジュールのインストールが実際に機能していました!

まだエラーが発生しているためだとは思いませんでした。手動でインストールした場合のように、AddRemoveプログラムにVC++ランタイムのエントリが表示されませんでした。

ただし、エラーが発生した場所まで配布可能ファイルとアプリケーションのみをインストールするようにインストールを変更すると、VC++dllが実際にインストールされていることがわかりました。私が今見たエラーは、プログラムがATL再配布可能も必要としたためでした。(Dependency Walkerを使用して発見したように)。エラーが原因でmsiが失敗し、VC++dllが残りのアプリケーションdllと一緒にアンインストールされていました。

ヘルプファイルの例のようなメカニズムを使用してVC++とATLの配布可能ファイルを提供すると、すべてが順調に進みました。

また、静的にリンクされたSQLite dllを使用しました。これは、ディストリビューターがインストールされていても、カスタムアクションからのSQLiteへの最初の呼び出しが失敗したためです。これはインストールシーケンスの問題が原因であると思います。ただし、静的にリンクされたバージョンを使用すると、ここで開発者の間である程度の議論が生じ、約50-50に分割され、使用に賛成と反対が強くなりました。

ただし、インストールは機能します。

于 2013-03-11T11:03:13.383 に答える
1

カスタムアクションがInstallFilesアクションの前にスケジュールされているか、延期されていないか、またはその両方のように聞こえます。カスタムアクション定義を提供しませんが、CustomAction要素にExecute属性が設定されていること'deferred'を確認し、Custom要素がInstallExecuteSequenceスケジュールされていることを確認してくださいAfter='InstallFiles'

または、CRTをカスタムアクションに静的にリンクすることを検討することもできます。カスタムアクションがスタンドアロンになり、カスタムアクションが常に機能する可能性が大幅に高まるため、このオプションを常にお勧めします(インストール、修復、アンインストール、パッチ適用中を含む)。

于 2013-03-08T16:46:07.617 に答える