2016-10-06 3 views
0

리플렉션을 사용하여 아래의 메소드를 어떻게 호출 할 수 있습니까?리플렉션을 사용하여 대리자 매개 변수가있는 메서드를 호출하려면 어떻게해야합니까?

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); 
    } 
} 

UPDATE : 내가 두 개의 라이브러리를 작성하여 문제를 해결했다. 인터페이스 라이브러리 및 클래스 라이브러리. 인터페이스 라이브러리는 클래스 라이브러리와 주 프로그램에 의해 참조됩니다. Awesomium은 클래스 라이브러리에 의해 참조됩니다. 런타임시 리플렉션에 의해 클래스 라이브러리를로드하고 인터페이스 라이브러리에 정의 된 메서드를 사용합니다.

+0

이 그것을 위임 매개 변수를 가지고 있기 때문에 질문이 다른 것입니다. – Tempeck

+0

네가 맞아,이 정도면 충분 해. 그리고 나는 명백한 복제물을 보지 못했다. –

+0

프록시가 동적이 아닌 JSValue를 반환해야합니다. –

답변

0

문제는 당신이 CreateDelegate의 첫 번째 인수를 오해이다 - 그것은 대리자의 형식이 아닌 대상을 의미한다 :

var d = Delegate.CreateDelegate(typeof(Func<object, dynamic, dynamic>), this, mi); 
+1

하지만 반영 할 대리자의 유형은 JavascriptMethodHandler입니다. – Tempeck

+0

@Tempeck 음, 메서드의 서명과 일치하지 않으므로 일치하지 않습니다. 정말로 원한다면 래퍼 함수를 ​​사용하여 두 개를 "번역"할 수 있지만주의해야합니다 -'동적'은 일종의 전염성이 있습니다 :) – Luaan

관련 문제