2014-02-07 3 views
0

다음 Delegate.CreateDelegate이 런타임 ArgumentException을 생성하는 이유는 무엇입니까?리플렉션을 통해 열린 인스턴스 대리자 만들기

static class Module1 
{ 
    public static void Main() 
    { 
     MyDataObject mdo = new MyDataObject(); 
     mdo.DoMagic("Hello"); 
    } 

    #region Assembly A 
    public class BusinessObject 
    { 
    } 

    public class MyBusinessObject : BusinessObject 
    { 

     public void DoMagic(string s) 
     { 
      Console.WriteLine(s); 
     } 
    } 
    #endregion 

    #region Assembly B 
    public class MyDataObject 
    { 
     private delegate void DoMagicDel(BusinessObject bo, string s); 

     private DoMagicDel delDoMagic; 
     public void DoMagic(string s) 
     { 
      BusinessObject bo = (BusinessObject)Activator.CreateInstance(Type.GetType("Module1+MyBusinessObject")); 
      MethodInfo mi = bo.GetType().GetMethod("DoMagic", BindingFlags.Public | BindingFlags.Instance); 
      // ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type. 
      delDoMagic = (DoMagicDel)Delegate.CreateDelegate(typeof(DoMagicDel), null, mi); 
      delDoMagic(bo, s); 
     } 
    } 
    #endregion 
} 

여기서 어셈블리 A에는 어셈블리 B에 대한 프로젝트 참조가 있지만 그 반대는 아닙니다. 첫 번째 매개 변수 인 DoMagicMel을 MyBusinessObject를 입력 할 때 변경하면 작동합니다. 그러나 조립품 B는이 유형의 조립품 A를 알지 못하므로이 간단한 예제에서만 작동합니다.

private delegate void DoMagicDel(MyBusinessObject bo, string s); 

이 작업을 수행 할 기회가 있습니까?

답변

2
ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type. 

이유는 다음 Delegate.CreateDelegate 런타임 ArgumentException을 생산 하는가?

  • DoMagicDel의 서명이 mi로 설명 된 서명의 서명과 일치하지 않기 때문에.

기회가 있을까요?

  • 예, 마일의 서명과 일치하도록 MakeGenericType를 사용 ...

    #region Assembly B 
    public class MyDataObject 
    { 
        public delegate void DoMagicDel<T1>(T1 arg1, string arg2); 
        private static Delegate delDoMagic; 
        public void DoMagic(string s) 
        { 
         var bo = Activator.CreateInstance("Module1", "Module1.MyBusinessObject").Unwrap(); 
         MethodInfo mi = bo.GetType().GetMethod("DoMagic", BindingFlags.Public | BindingFlags.Instance); 
         var doMagicDelType = typeof(DoMagicDel<>).MakeGenericType(bo.GetType());    
         if (delDoMagic == null) 
          delDoMagic = Delegate.CreateDelegate(doMagicDelType, null, mi); 
         delDoMagic.DynamicInvoke(bo, s); 
        } 
    } 
    #endregion 
    

내가 너무 늦게 아니에요 희망을

관련 문제