如何使用反射调用下面的方法?
namespace Awesomium.Core
{
public delegate JSValue JavascriptMethodHandler(object sender, JavascriptMethodEventArgs e);
public class JSObject
{
public void Bind(string methodName, JavascriptMethodHandler handler)
{
// Does something...
}
}
}
我的进度如下。我在CreateDelegate上得到异常。
无法绑定到目标方法,因为其签名或安全透明度与委托类型的签名或安全透明度不兼容。
public class AwesomiumHelper
{
private Func<object, dynamic, dynamic> JavascriptMethodHandlerAction;
public void RegisterJavascriptMethodAndBind(string methodName, Func<object, dynamic, dynamic> func)
{
if (func != null)
{
var jsoType = AwesomiumCore.GetExportedTypes().First(f => f.Name == "JSObject");
var jso = Activator.CreateInstance(jsoType);
var t = AwesomiumCore.GetTypes().FirstOrDefault(f => f.Name == "JavascriptMethodHandler");
var mi = typeof(AwesomiumHelper).GetMethod("JavascriptMethodHandlerProxy", BindingFlags.NonPublic | BindingFlags.Instance);
// GETTING EXCEPTION HERE
var d = Delegate.CreateDelegate(t, this, mi);
// GETTING EXCEPTION HERE
JavascriptMethodHandlerAction = func;
var mi0 = jsoType.GetMethod("Bind", new[] { typeof(string), t });
mi0.Invoke(jso, new object[] { methodName, d });
}
}
private dynamic JavascriptMethodHandlerProxy(object sender, dynamic e)
{
return JavascriptMethodHandlerAction?.Invoke(sender, e);
}
}
更新:我通过创建两个库解决了这个问题。接口库和类库。接口库由类库和主程序引用。Awesomium由类库引用。在运行时,我通过反射加载类库并使用接口库中定义的方法。
问题是您误解了CreateDelegate
的第一个参数-它指的是委托的类型,而不是目标:
var d = Delegate.CreateDelegate(typeof(Func<object, dynamic, dynamic>), this, mi);