2015-07-13 4 views
0

Ситуация:
У меня есть dll и программа, которая должна использовать эту dll с Late binding.
. Net wrapper eventhandling

Каждый метод работы - это также события. Для примера выполнено событие каротажа. Я хочу использовать собственный метод ведения журнала в программе, но вот моя проблема. Я не знаю, как это сделать.

журнала длл класс (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 во внешней программе с нагрузками DLL, к сожалению, на другом языке (VB.NET.):

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 

Теперь может кто-нибудь показать мне, как я пишу и добавляю метод ведения журнала/обработчик событий во внешней программе с вызовом, тогда событие в ddl будет поднято?

ответ

0

Одним из возможных решений является использование Reflection добавить событие:

' 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)