为什么以下代码会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);
有机会工作吗?
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
匹配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
我希望我还不算太晚...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句