2010-06-17 6 views
2

WebBrowser 컨트롤이 있습니다. head 태그에 JavaScript를 추가했는데 경고를 추가하여 예상대로 작동하는 것을 볼 수 있습니다. # 내가 뭐하는 거지C#을 사용하여 JavaScript로 작성된 사용자 정의 객체에서 메서드를 호출하려면 어떻게해야합니까?

function test() { 
} 

test.prototype.run = function() { 
    alert('success!') 
} 

function createTest() { 
    return new test() 
} 

을 다시 C의 내부 : 이것이 내가 함수를 만들고과 같이 그것의 프로토 타입 일부 구성원을 추가하고 JS의 내부

dynamic test = this.browser.InvokeScript("createTest"); 
test.run(); 

을 나는 테스트 개체는 것을 알 수 있습니다 일부 ComObject하지만 run() 호출 할 때 아무 일도 발생하지 않습니다. 나는 오류가 없지만 아무 일도 일어나지 않는다. 누구든지이 유형의 사용자 정의 객체를 호출하는 방법을 알고 있습니까?

또한 createTest() 메소드를 없애고 싶다면 C#에서 test의 새 인스턴스를 어떻게 만들 수 있습니까?

또한, 보너스 포인트로, 내 C# 코드에 콜백 할 수 있도록이 사용자 지정 개체 ('완전한'멤버)에 이벤트를 연결하는 데 필요한 특별한 것이 있습니까?

+1

왜 내가 이것을해야하는지 모르겠다.하지만 내가 리플렉션을 사용하면 InvokeMember MemberInfo 객체를 가져올 수있다. 그러면 Invoke를 호출 할 수 있고 실제로 js 객체의 멤버를 호출 할 것이다! 나는 왜 동적 인 오브젝트가 이것을 아직하지 않는지 모르지만, 누군가가 더 깨끗한 방법을 먼저 찾을 수 없다면 나는 이것을하기 위해 만든 래퍼 코드를 게시 할 것이다. –

답변

0

"동적 인"키워드가 어떤 이유로 든 알아낼 정도로 똑똑하지는 않습니다. InvokeScript에서 반환 된 COM 개체를 IExpando (또는 IReflect)로 캐스팅하고 InvokeMember 메서드를 호출 할 수 있습니다. 모든 TryXYZ 메서드를 재정의하고 IReflect/IExpando 메서드 호출로 변환하는 DynamicObject를 상속 한 클래스를 만들었습니다. 그런 다음 위의 스 니펫과 같은 객체와 상호 작용할 수 있습니다.

+0

이 질문을 확인해 주시겠습니까 ?? : http://stackoverflow.com/questions/5009189/cant-call-method-of-a-javascript-object-created-in-code-injected-to-webbrowsers – Juan

0

빈 System.object 배열을 InvokeScript의 두 번째 인수로 전달한 다음 test.run();을 호출하십시오.

+0

주사위가 없습니다. 같은 결과. –