.Net包装程序事件处理



情况:
我有一个dll和一个程序,它应该使用这个带有延迟绑定的dll

每一种方法都在起作用。例如,有一个日志事件。我想在程序中有一个自己的日志记录方法,但这是我的问题。我不知道怎么做。

dll日志类(c#(:

/// <summary>
/// log helper class.
/// </summary>
public static class Log {
    // ######### Enum #############################################################################################
    /// <summary>
    /// Log level enum.
    /// </summary>
    public enum LogLevel {
        None = -1,
        Debug = 0,
        Info = 1,
        Warn = 2,
        Error = 3,
        Fatal = 4
    }

    // ######### Events ###########################################################################################
    /// <summary>
    /// log helper class log event.
    /// </summary>
    public static event EventHandler<HelperLogEventArgs> HelperLog;

    // ######### Constructor ######################################################################################
    /// <summary>
    /// Default constructor
    /// </summary>
    static Log() {
        HelperLog += DebugLog;
    }

    // ######### Methods ##########################################################################################
    /// <summary>
    /// log helper class log event handling.
    /// </summary>
    /// <param name="e">Log event arguments</param>
    public static void OnHelperLog(HelperLogEventArgs e) {
        EventHandler<HelperLogEventArgs> handler = HelperLog;
        if (handler != null) {
            handler(null, e);
        }
    }

    /// <summary>
    /// Log a message to the debug console.
    /// </summary>
    /// <param name="sender">Event sender</param>
    /// <param name="e">Log event arguments</param>
    private static void DebugLog(object sender, HelperLogEventArgs e) {
        Debug.WriteLine(String.Format(" [{0}]: {1}", e.logLevel.ToString(), e.message));
    }

    /// <summary>
    /// Log a message.
    /// </summary>
    /// <param name="level">Log level</param>
    /// <param name="message">Log message</param>
    public static void Log(LogLevel level, string message) {
        HelperLogEventArgs args = new HelperLogEventArgs();
        args.logLevel = level;
        args.logTime = DateTime.Now;
        args.message = message;
        OnHelperLog(args);
    }

    // ######### Help Classes #####################################################################################
    /// <summary>
    /// log helper class event argument class.
    /// </summary>
    public class HelperLogEventArgs : EventArgs {
        /// <summary>
        /// Log message log level.
        /// </summary>
        public Log.LogLevel logLevel;
        /// <summary>
        /// Log message text.
        /// </summary>
        public string message;
        /// <summary>
        /// Log message log timestamp.
        /// </summary>
        public DateTime logTime;
    }
}

现在,我在外部程序中有一个Wrapper类,不幸的是,它用另一种语言(vb.Net(加载dll:

If _oAssembly Is Nothing Then
    _oAssembly = Assembly.LoadFrom(sTfsHelperDllPath)
End If
' This will not throw an exception but return nothing.
_oTFSHelper = _oAssembly.CreateInstance("TFSHelper.TFSHelper")
If _oTFSHelper Is Nothing Then
    ' Throw manually an exception on error.
    Throw New Exception("## TFSHelper could not be loaded. ##")
End If

现在有人能告诉我如何在外部程序中编写和添加一个日志方法/事件处理程序吗?如果调用了will,那么ddl中的事件就会被引发?

一种可能的解决方案是使用反射添加事件:

' Add event Handler
Dim method As MethodInfo = Me.GetType().GetMethod("<NewEventHandlerName>", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Public)
Dim eventInfo As EventInfo = _oTFSHelper.GetType().GetEvent("<EventName>")
Dim type As Type = eventInfo.EventHandlerType
Dim handler As [Delegate] = [Delegate].CreateDelegate(type, Me, method)
eventInfo.AddEventHandler(_oTFSHelper, handler)

最新更新