情况:
我有一个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)