2012-10-15 53 views
0

我有一個項目,並在該項目中我動態加載了一個dll。它看起來像:如何動態調用事件

AssemblyPart assemblyPart = new AssemblyPart(); 
WebClient downloader = new WebClient(); 
string path = string.Format("../ClientBin/{0}.xap", "AgileTax"); 
downloader.OpenReadCompleted += (e, sa) => 
     { 
getdllinStream = GetStream(sa.Result, _CurReturnType.PackageName + "ERC", true); 
_formsAssembly = assemblyPart.Load(getdllinStream); 
foreach (var item in _formsAssembly.GetTypes()) 
        { 
         if (item.FullName == _CurReturnType.PackageName + "ERC.State.StateMain") 
         { 
          ATSpgm = item; 
         } 
        } 
    var class_instance = _formsAssembly1.CreateInstance(PackageName + "ERC.State.StateMain"); 
if (class_instance != null) 
      { 

       MethodInfo[] infomem = ATSpgm.GetMethods(); 
       MethodInfo SetVarDllNG1 = ATSpgm.GetMethod("ProcessERC"); 
       SetVarDllNG1.Invoke(class_instance, parametersArray); 
      } 
     } 
downloader.OpenReadAsync(new Uri(path, UriKind.Relative)); 

現在我的問題是,在該.dll我有這樣的代碼:

public event ERCErrorHandling OnERCErrorHandler; 
    public delegate string ERCErrorHandling(Exception ex); 

現在的問題是如何把這種ERCErrorHandling事件同上述我所說的方法類似ProcessERC 。

+0

@Baboon:爲了公平起見,幾乎沒有他的開放性問題有任何答案接受。 –

+0

請看這裏:http://stackoverflow.com/questions/6010555/how-to-call-delegate-from-string-in-c –

回答

1

一個事件只是一個MulticastDelegate類型的字段。這意味着您可以使用這些指令得到它:

 FieldInfo anEvn = item.GetType().GetField("OnERCErrorHandler", 
      System.Reflection.BindingFlags.Instance | 
      System.Reflection.BindingFlags.NonPublic) as FieldInfo; 
     if (anEvn != null) 
      MulticastDelegate mDel = anEvn.GetValue(item) as MulticastDelegate; 

然後你就可以得到()連接到該事件的一個代表使用GetInvokationList。每個委託都有一個Target(將執行該方法的對象)和Method。你可以遍歷它們執行它們。當然,你要知道,爲了預期的參數傳遞他們調用:

   Delegate[] dels = mDel.GetInvocationList(); 
       object[] parms = new object[1]; 
       parms[0] = null; // you must create the Exception you want to pass as argument here 
       foreach (Delegate aDel in dels) 
        aDel.Method.Invoke(aDel.Target, parms); 
+1

謝謝聲音很好 –