3

Wix を使用して Windows インストーラー .msi ファイルをセットアップしています。ScheduledTask を設定する CustomAction があり、CustomAction にいくつかの session.Log ステートメントを入れました。

すべてをデバッグ モードでビルドすると、session.Log ステートメントは機能しているように見えますが、リリース モードでビルドすると、ログに記録されないようです。これは正しいです?または、session.Log が機能しない他のシナリオはありますか? session.Log が常に機能するように、これらのシナリオを回避する方法はありますか?

編集: CustomAction は C# で記述されています (つまり、マネージド)

4

2 に答える 2

1

使用言語を教えていただけると助かります...

マネージド コードを使用している場合は、制限に注意してください (以下、WiX のドキュメントから引用)。

従来のネイティブ C++ コードではなくマネージ コードでカスタム アクションを記述することを選択する前に、次の点を慎重に検討する必要があります。

  • 明らかに、.NET Framework への依存が導入されます。MSI パッケージには、何かが起こる前に正しいバージョンの .NET Framework が存在するかどうかを確認する LaunchCondition が含まれているはずです。

  • カスタム アクションがアンインストール時に実行される場合、.NET Framework が存在しないと、製品のアンインストールでさえ失敗する可能性があります。これは、ユーザーが製品の前に .NET Framework をアンインストールすると、問題が発生する可能性があることを意味します。

  • マネージド カスタム アクションは、特定のバージョンの .NET Framework に対して実行するように構成する必要があり、そのバージョンは、実際の製品が実行されるバージョンと一致する必要があります。バージョンを最新のインストール済み .NET Framework に "フローティング" できるようにすると、将来のバージョンとの互換性の問題が発生する可能性があります。.NET Framework がサイド バイ サイド機能を提供するのには十分な理由があります。それを使用してください。

さらに、 VBScript (および JScript) MSI CustomActionsがうまくいかない理由もお読みください。

とにかく、それをすべて無視します...これは、ログに使用する、ずっと前にどこかで見つけたサンプルC++コードです。選択した言語で呼び出す必要がある正しい関数を把握できる場合があります。

#define _USE_RTM_VERSION 

void LogString(MSIHANDLE hInstall, TCHAR* szString)
{
    PMSIHANDLE newHandle = ::MsiCreateRecord(2);
    TCHAR szTemp[MAX_PATH * 2];
    sprintf_s(szTemp, MAX_PATH * 2, "-- MSI_LOGGING --   %s", szString); 
    MsiRecordSetString(newHandle, 0, szTemp);
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_INFO), newHandle);
}

UINT __stdcall MyCustomAction ( MSIHANDLE hModule )
{
    LogString(hModule, "Whoa! I am a custom action..");
    return ERROR_SUCCESS;
}
于 2009-11-05T21:45:37.583 に答える
0

ログに記録される内容は、ログ オプションによって制御されます。デバッグ バージョンをインストールする場合と比較して、リリース バージョンをインストールする場合のオプションは同じですか?

于 2011-05-05T11:21:02.663 に答える