2016-08-26 5 views
2

WPF WebBrowser 개체의 전용 속성 값을 가져 오려고합니다. 디버거에서 null이 아닌 값이 있음을 알 수 있습니다.PropertyInfo.GetProperty가 없어야 할 때 null을 반환합니다.

PropertyInfo activeXProp = Browser.GetType().GetProperty("ActiveXInstance", BindingFlags.Instance | BindingFlags.NonPublic); 
object activeX = activeXProp.GetValue(Browser, null); // here I get null for the activeX value 
activeX.GetType().GetProperty("Silent").SetValue(activeX, true); // and here it crashes for calling a method on a null reference... 

내 생각에 적절한 방식으로 리플렉션을 사용하지 않지만이 경우 적절한 방법은 무엇입니까? 프로젝트는 .NET 4.6.1 및 Windows 10에서 실행되는 WPF 프로젝트입니다. 관리자 권한으로 실행 (프로젝트에 매니페스트 파일 추가)했지만 아무런 효과가 없습니다.

+2

'activeX'가'null'입니까? 나에게 널주지 않는다. –

+0

시험해 주셔서 감사합니다. 불행히도 그것은 정말로 나에게 null 값을줍니다. 다음은 전체 프로젝트입니다. https://github.com/zskolbay/WpfBrowserTest – Bedford

+0

github에서 코드를 테스트 한 결과,'activeX'는 null이 아닙니다. 다음 행에서만 예외가 발생합니다. –

답변

2

activeX.GetType()에 의해 반환 된 형식은이 반사를 지원하지 않는 System .__ ComObject입니다. 그러나 두 가지 쉬운 솔루션이 있습니다. dynamic

dynamic activeX = activeXProp.GetValue(Browser, null); 
activeX.Silent = true; 

dynamic 사용

(모든 액티브 소자에 의해 구현되는)를 의 IDispatch COM 인터페이스가 제공 COM 반사의 모든 유형을 지원한다.

그냥 반사

코드에 작은 변화는 위의 코드와 같은 수행합니다

object activeX = activeXProp.GetValue(Browser, null); 
activeX.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, activeX, new object[]{true}); 

두 가지 방법은 개체에 같은 일을 호출,하지만 난 첫 번째는 추측 통화 사이트의 캐싱으로 인해 시간이 지남에 따라 더 빠릅니다. 어떠한 이유로 든 dynamic을 사용할 수없는 경우에만 두 번째 것을 사용하십시오.

관련 문제