2016-04-28 3 views
2

私は現在、VB.NETプロジェクト(Imports文、宣言など)で参照する無料のNLogロギングライブラリ(DLL)を使用するアプリケーションを使用しています。オブジェクトを使用するためにImportsステートメントとDLLをコードに置き換えますか?

無料のNLogロギングライブラリを使用するアプリケーションに共通の機能を含むクラスライブラリ(DLL)を作成しました。私の主なアプリケーションのためにNLog.dllをアップグレードすると、クラスライブラリアプリケーションを起動して更新する必要があります。私は毎回クラスライブラリを更新/再コンパイルする必要がなく、現在のオブジェクトを渡したり、NLogアセンブリを動的に(コード内に)ロードしたいと思っています。

Imports NLog 

Private mLog As Logger 

Public ReadOnly Property Log As Logger 
    Get 
     If (mLog Is Nothing) Then 
      mLog = LogManager.GetCurrentClassLogger 
     End If 
     Return mLog 
    End Get 
End Property 

Later on used as: 
Log.Error("Message...") 

私は関数にNLogオブジェクトに渡し、その後、何とかNLogアセンブリをロードし、それを使用する変数を宣言するために期待していた:私のクラスライブラリプロジェクトで

は、私はこのような何かを持っています。

''Imports NLog 

Private mLog As Object 

Public ReadOnly Property Log As Object 
     Get 
      If (mLog Is Nothing) Then 
       Dim theAssembly As Assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory & "NLog.dll") 
       Dim typeLogManager As Type = theAssembly.GetType("NLog.LogManager") 
Dim myObj As Object = Activator.CreateInstance(typeLogManager) 
       mLog = typeLogManager.InvokeMember("GetCurrentClassLogger", BindingFlags.Default Or BindingFlags.InvokeMethod, Nothing, myObj, Nothing) 
      End If 
     Return mLog 
    End Get 
End Property 

私は、これは「CurrentClassLogger」オブジェクトを作成するだろうと思ったが、それはエラーで失敗し続ける「このオブジェクトのために定義されていませんパラメータなしのコンストラクタ。」ライン上で

Dim myObj As Object = Activator.CreateInstance(typeLogManager) 

ここで間違っていることや私が紛失していることがわかりません。私はNLogアセンブリで参照(インポート)したのと同様のLoggerを作成することができます。どんなヘルプやサンプルコードも大歓迎です!

種類よろしく

答えて

1

まずあなたがすでに行ったようLogManagerタイプを取得します。次に、静的なGetCurrentClassLoggerメソッドを取得して起動します。

Dim typeLogManager As Type = theAssembly.GetType("NLog.LogManager") 
Dim currentLoggerMethod As MethodInfo = typeLogManager.GetMethod("GetCurrentClassLogger", Type.EmptyTypes) 
mLog = currentLoggerMethod.Invoke(Nothing, Nothing) 
+0

ありがとうございました!ロガーとしてキャストせずにLoggerのインテリセンス(mLogに返されるオブジェクト)を保持する方法はありますか(import文を含める必要があります)?私はまだintellisenseを持つことができたいと思うし、mLogがObjectとして宣言されているので、私はそれを得ることができないことを知っています。私はちょうどこれを持っていたが、多くのぎこちない:Dim MyObj As Object = Activator.CreateInstance(typeLogManager、BindingFlags.CreateInstanceまたはBindingFlags.NonPublicまたはBindingFlags.InstanceまたはBindingFlags.OptionalParamBinding、Nothing、Nothing、Nothing、Nothing) – DataCrypt

+0

いいえそれは不可能です。 – thehennyy

+0

どのバージョンのNLogを組み合わせたいですか? – Julian

関連する問題