2011-09-07 3 views
5

파이썬에서이 COM 객체를 사용하려고 할 때 나는 모두 win32com.client.Dispatch("Myapp.Thing.1")이고 메소드와 같은 것을 호출 할 수있는 객체를 제공합니다. .문자열에서 ID를 사용하여 C#에서 레거시 COM 객체를 동적으로 인스턴스화합니다.

나는 C#에서 이것을하고 싶어하고, 놀랍게도, 나는 어떻게 알아낼 수 없다. 내가 할 내가 자동으로 생성 된 COM 래퍼 중 하나를 사용하고 싶지 않아, 내가 들어갈 수없는 이유. 나는 늦은 구속력, 과거의 역동적 인 COM을 할 필요가있다.

이 작업을 시도했지만 invoke 호출에 Null 참조 예외가 발생합니다.

Type t = Type.GetTypeFromProgID("Myapp.Thing.1") 
o = Activator.CreateInstance(t) 
t.GetMethod("xyz").Invoke(o, args) 

COM 개체를 이름으로로드하여 기본 방식으로 사용할 수있는 예제 코드가 이상적입니다.

+0

Jason 먼저 Jason은 코드에 몇 가지 검사를 추가하고 t 또는 o가 null인지 식별 ​​할 수 있습니까? 그렇다면 당신이 우리에게 말하면, 우리는 그것을 볼 수 있습니다. –

+0

나는 그 장소에서 그 수표를 가지고 돌아 왔고, t도 o도 돌아 오지 않는다. 도와 줘서 고마워! – William

+0

그리고 그 개체에 xyz 메서드가 있는지 확인 하시겠습니까? –

답변

8

GetTypeFromProgID를 통해 형식을 검색 할 때 실제로 형식이없는 경우 - 만든 COM 개체를 래핑하는 __ComObject 형식이 있으므로 형식이 "xyz"가 아닙니다. 따라서 null 참조 예외 - GetMethod("xyx")이 null을 반환합니다. 메소드를 호출하기 위해

대신 t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args)를 사용

Type t = Type.GetTypeFromProgID("Myapp.Thing.1") 
o = Activator.CreateInstance(t) 
t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args) 
+0

그것이 작동하는 것 같아! 그리고 어떻게 속성을 얻을/설정합니까 ?? 정말 고마워! – William

+0

당신은 여전히 ​​InvokeMember를 사용하고,'BindingFlags' 매개 변수는 당신이하는 것을 제어합니다 -'BindingFlags.GetField' 나'BindingFlags.GetProperty' 등을 사용하십시오. http://msdn.microsoft.com/en-us/library/66btctbe.aspx 및 http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx를 참조하십시오. –

8

당신은 정확하게가 무엇의 동적 유형을 사용합니다. 래퍼없이 인스턴스를 입력 할 수는 없습니다. 대신 당신은 이것을 할 수 있습니다.

dynamic app = Activator.CreateInstance(
             Type.GetTypeFromProgID("MyApp.Thing.1")); 
app.XYZ(): 
관련 문제