在代码中替换Imports语句和加载DLL以使用对象?

时间:2016-04-28 16:13:17

标签: .net vb.net .net-assembly nlog

我目前有应用程序使用免费的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。非常感谢任何帮助和示例代码!

亲切的问候

1 个答案:

答案 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)