5

アプリケーションから使用され、Visual Studio インストーラー プロジェクトの .NET カスタム アクションでも使用されるライブラリ コードがいくつかあります。ライブラリ コードは、Enterprise Library ログ ブロックを使用してログを記録します。msiexec 内で実行されているカスタム アクションのコンテキストで Enterprise Library の構成情報を取得するにはどうすればよいですか? EntLib を呼び出す前に、コードで構成メカニズムをブートストラップすることは可能ですか?

更新: 動作するように見えるハックを作成しましたが、リフレクションを使用して非公開の静的フィールドを設定することに依存しています。EntLib が .NET ConfigurationManager と非常に緊密に結合されているのは残念です。

var factory = new LogWriterFactory( new FakeConfigSource( "foo.config" ) );
var field = typeof ( Logger ).GetField( "factory", BindingFlags.Static | BindingFlags.NonPublic );
field.SetValue( null, factory );
Logger.Write( "Test" );

更新 2: このハックはテストベッドで機能しますが、msiexec のコンテキストで実行すると、アセンブリ ローダーは構成ファイルで参照されているアセンブリを検出しません。Fuslogvw は、AppBase が Windows の system32 ディレクトリであることを示しています。私が理解していないのは、カスタム アクション アセンブリのマニフェストの依存関係 (カスタム アクション アセンブリと一緒に [TargetDir] ディレクトリにある) が見つかるのに、構成ファイルで呼び出される動的に読み込まれるアセンブリが見つからない理由です。これを回避する方法はありません。

4

5 に答える 5

1

LoadFrom問題は、カスタムアクションアセンブリがコンテキストに読み込まれているため、そのマニフェストの依存関係がコードベースに対して解決されていることだと思います。

新しいを作成することで、この問題を解決できる場合がありますAppDomain。これにより、ベースディレクトリをリセットしたり、新しいApp.configファイルをロードしたりすることができます。AppDomain.CreateDomain(String、Evidence、AppDomainSetup)を使用して、新しいAppDomainを作成し、ApplicationBase、ConfigurationFileなどのAppDomainSetupプロパティを設定します。

于 2009-03-03T00:13:24.020 に答える
1

app.config は、MSI を実行する前に編集する必要がある msiexec.config であるため、標準の app.config の方法を使用する方法はありません。カスタム XML または MSI の値から読み取る独自の構成読み込みメソッドを用意することをお勧めします。

于 2009-02-26T12:05:31.387 に答える
0

msiexecがカスタムアクションの依存関係を読み込めないという同様の問題がありました。現在の解決策は、依存するアセンブリをシステムディレクトリにコピーすることです。これはひどい解決策ですが、機能します。

string installDir = System.IO.Path.GetDirectoryName(
                System.Reflection.Assembly.GetExecutingAssembly().Location);
System.IO.File.Copy(
                System.IO.Path.Combine(installDir, "<Insert Assembly Name>.dll"),
                System.IO.Path.Combine(Environment.SystemDirectory, "<Insert Assembly Name>.dll"),
                true);

もう1つのオプションは、エンタープライズライブラリアセンブリをGACにインストールすることです。これを行う場合は、Orcaなどを使用してmsiを編集し、インストーラーをGACにインストールしてから、デフォルトでカスタムアクションを実行する必要があります。デフォルトではカスタムアクションが最初に実行されます。

私はまだこれに対する本当にきちんとした解決策を探しています、そして私がそれを見つけたらこの応答を更新します。

于 2009-02-24T15:23:15.373 に答える
0

これが役立つかどうかはわかりませんが、カスタム アクション内から msi ログに書き込むことができます。(以下のサンプル VBScript:)

Const msiMessageTypeInfo = &H04000000
Const msiMessageTypeFatalExit = &H00000000
Const msiMessageTypeError = &H01000000
Const msiMessageTypeWarning = &H02000000
Const msiMessageTypeUser = &H03000000 

Dim rec : Set rec = Session.Installer.CreateRecord(1)
rec.StringData(1) = "Your log message."

Session.Message msiMessageTypeInfo, rec

MSDN からの詳細情報: http://msdn.microsoft.com/en-us/library/aa371672.aspx

于 2008-12-12T06:17:35.713 に答える