我目前有应用程序使用免费的NLog日志记录库(DLL),我在我的VB.NET项目中引用它(Imports语句,声明它等)。
我编写了一个类库(DLL),它包含了我的应用程序的一些常用功能,它还使用了免费的NLog日志记录库。我的问题是,当我为我的主应用程序升级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。非常感谢任何帮助和示例代码!
亲切的问候
答案 0 :(得分: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)