0

プロジェクトが1つあり、そのプロジェクトで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);

ここで私の質問は、ProcessERCのようなメソッドを呼び出したのと同じようにこのERCErrorHandlingイベントを呼び出す方法です。

4

1 に答える 1

1

イベントは MulticastDelegate 型の Field です。これは、次の手順で入手できることを意味します。

        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() を使用して、イベントに関連付けられた単一のデリゲートを取得できます。各デリゲートには、ターゲット (メソッドを実行するオブジェクト) とメソッドがあります。それらをすべて実行してループすることができます。もちろん、Invoke に渡すには、予想されるパラメーターを知っている必要があります。

                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);
于 2012-10-15T14:28:54.247 に答える