2017-10-11 6 views
0

私はVS 2015でWiXを習得しています。私は多くのオプションを見つけました(例えば、インストーラにデータを入れ、CAに情報を渡すなど)。しかし、よく知っていることも1つあります: ログはカスタムアクションだけでなく、インストーラで使用したいいくつかの余分なクラスからも取得できますか?可能な方法はありますか?エクストラクラスを使ったカスタムアクションからログを取得するC#in WiX

編集: 私の質問を理解できない人もいると思います。それが私が簡単な例をしようとする理由です。 まず私たちは、カスタムアクションを持っている:私はC#で、余分なクラス必要がある。この例では、パスを取得するために

[Custom Action] 
public static ActionResult Example (Session session) 
{ 
    session.Log("Beginn of Custom Action 'Example'"); 
    NewPath newPath = new NewPath("any path"); 
    session["NEWPATH"] = newPath.gettingPath(); 
    session.Log("End of Custom Action 'Example'"); 
    return ActionResult.Success; 
} 

そして:

namespace Path 
{ 
    private string _path; 
    class NewPath 
    { 
     public NewPath(string path) 
     { 
     this._path = path; 
     } 
     public string gettingPath() 
     { 
     if(Directory.exists(this._path)) 
     { 
      Directory.CreateDirectory(this._path); 
     } 
     return this._path; 
     } 
    } 
} 

をそして今、私はまたログを取得しようとしたいですクラスからgettingPath 私はこの例が理解できる(と間違いがない):

編集2:私のクラスを終了するためにいくつかの事を追加しました。 これはにすぎません。もちろんそれは絶対に正しいわけではありません。

答えて

0

gettingPath()は、クラスNewPathのメンバーメソッドです。 カスタムアクションからセッションをログに記録する唯一のインターフェースは、Sessionオブジェクトです。

セッションオブジェクトをカスタムアクション内のクラス(NewPathなど)に渡すことができます。

別のオプションは、カスタムアクションシグネチャを含むクラスに静的NLogを定義することです。

_logger = LogManager.GetCurrentClassLogger(); 

と同じセッションオブジェクトとしてNLogターゲットを設定します。そうすることで、_loggerを含むクラスのどこにでも使用できます。 NLogの詳細については

、あなたがこのことについて間違った道を進んでいるようです一般的にhttp://nlog-project.org/

+0

ニースの回答。しかし、私は他のプロジェクトなしでそれを使用したい。それはまだ可能ですか? –

0

を参照してください。カスタムアクションは、学ぶべき最後のものです。それは、Windows Installerがコードなしで何ができるのかを見つけた後です。 WiXおよびWindowsインストーラは、すべてのクラスのコーディングフレームワークではありません。これは可能な限りカスタムアクションを避けなければならないデータ駆動のインストールです。 WiX発明者/所有者は、カスタムアクションが失敗の入場料であることを述べている:

http://robmensching.com/blog/posts/2007/8/17/zataoca-custom-actions-are-generally-an-admission-of-failure/

ので、代わりにあなたがやりたいものは何でも、クラスやコーディングの話で、すでにビルトインカスタムアクションのWiXで利用可能であるかもしれません、 Windowsインストーラ機能、またはWiX Util機能をサポートしています。あなたの場合は、コードから、使用するパスを取得しようとしている可能性があります。コーディングの問題を説明するのではなく、コードを必要としない問題を解決する方法はいくつもあるかもしれないので、そのコードで何を達成しようとしているのかを述べるべきです。

コードにはCreateDirectory呼び出しも含まれています。これは、1)Windows Installer/WiXではコードなしで実行できます.2)カスタムアクションで行う作業(ディレクトリの作成など)はすべてロールバックが必要ですインストールが失敗した場合はカスタムアクションを削除し、削除するカスタムアクション(または同等のもの)をアンインストールします。これは可能な限りコードを避けるべき理由の一部です。

私はあなたのWiXチュートリアルを働いていると仮定します。

https://www.firegiant.com/wix/tutorial/

、多分ブックのWiX:開発者ガイドWindowsインストーラのXMLだけでなく、すべての例が利用可能。

ログは組み込みのWindowsインストーラ機能です。ログは/ l * vxを含むmsiexecコマンドラインで生成され、そこにログエントリが含まれます。マネージコードのカスタムアクションでは、ロギングを提供するセッションオブジェクトです。これは、コード内の他の場所からセッションオブジェクトにアクセスして(ロギングを行うため)、C#プログラミングの質問にすぎません。その場合、そしてあなたのサンプルコードでは、あなたのNewPathコンストラクタはSessionオブジェクトを受け取り、そのクラスにローカル参照を保持するオーバーロードを必要とします。または、セッションをパラメータとして取得するgetPathメソッドへのオーバーロードがあります。

Win32の世界では、MsiProcessMessageとC++のカスタムアクションが使用されます。

+0

いい答えですが、私の質問に答えてくれないので、助けにはなりません。新しいディレクトリを作成する必要はありません。 WiXはそれ自体を行うことができます。しかし、私が表示したくないコードは、この例よりも何かを持っています。 –

+0

"これは、コード内の他の場所からセッションオブジェクトにアクセスする(ロギングを行う)ために、C#プログラミングの質問に過ぎないことがあります。その場合、サンプルコードで、NewPathコンストラクタは、 Sessionオブジェクトを作成し、クラス内のローカル参照を保持するか、セッションをパラメータとするgetPathメソッドへのオーバーロードがあります。 " - どのように考えられるのでしょうか?それが私の質問です。 –

関連する問題