.net 通过反射创建开放实例委托

.net 通过反射创建开放实例委托,.net,vb.net,reflection,delegates,contravariance,.net,Vb.net,Reflection,Delegates,Contravariance,为什么以下Delegate.CreateDelegate生成运行时参数异常 static class Module1 { public static void Main() { MyDataObject mdo = new MyDataObject(); mdo.DoMagic("Hello"); } #region Assembly A public class BusinessObject { }

为什么以下
Delegate.CreateDelegate
生成运行时参数异常

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);
有机会让它工作吗

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描述的方法的签名不匹配
有机会让它工作吗

ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
  • 是,使用
    MakeGenericType
    匹配mi的签名:

    #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
    
    #区域组件B
    公共类MyDataObject
    {
    公共委托void DoMagicDel(T1 arg1,字符串arg2);
    私有静态委托delDoMagic;
    public void DoMagic(字符串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);
    动力三角帆蚌(bo,s);
    }
    }
    #端区
    
我希望我不会太晚