在代码中替换 Imports Statement 和 Load DLL 以使用对象?

Replace Imports Statement and Load DLL in code to use object?

我目前有一些应用程序使用免费的 NLog 日志记录库(一个 DLL),我在我的 VB.NET 项目(导入语句、声明它等)中引用了它。

我编写了一个 Class 库 (DLL),其中包含我的应用程序的一些常用功能,该应用程序还利用免费的 NLog 日志记录库。我的问题是,当我为我的主应用程序升级 NLog.dll 时,我还需要去更新我的 Class 库应用程序。我不想每次都必须 update/re-compile class 库,并且想传入当前对象或动态加载 NLog 程序集(在代码中)。

在我的 class 图书馆项目中,我有这样的东西:

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" 对象,但它一直失败并在

行显示错误 "No parameterless constructor defined for this object."
Dim myObj As Object = Activator.CreateInstance(typeLogManager)

不确定我在这里做错了什么或者我错过了什么。我希望能够创建类似于我在 NLog 程序集中引用(导入)的记录器。非常感谢任何帮助和示例代码!

亲切的问候

首先像您已经做的那样获取 LogManager 类型。然后获取静态GetCurrentClassLogger方法并调用它:

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