2013-04-01 2 views
1

.Net 2.0으로 작성된 다른 프로젝트와의 호환성을 허용하기 위해 COM interop (최신 응용 프로그램은 .Net 4.0에 포함됨)이 필요했습니다. 이것은 2.0 프로세스가 .Net 4.0에서 SxS 실행을 사용할 수 있기 때문에 효과가 있습니다. 내가 이해에서 COM의 상호 운용성을 위해 나는 같은 것을 할 필요가 :리플렉션을 사용하여 COM 개체에서 메서드 호출

Type myClass = Type.GetTypeFromProgID("Net4Assembly.Assembly4"); 
object myInstance = Activator.CreateInstance(myClass); 
IAssembly4 assembly4Interface = (IAssembly4)myInstance; 
assembly4Interface.CallMethod(); 

이미 COM 구성 요소를 생성하고 등록을하고이 잘 작동합니다. 그러나 문제는 2.0으로 작성된 프로젝트가 우리 부서 외부에 있기 때문에 위의 3 번 줄에서 리플렉션을 사용하여 캐스팅을 수행하는 방법을 찾고 싶습니다. 지금까지 나는 제안을 찾았습니다 Invoke method using Reflection on COM Object

그러나 COMObject 유형의 "myInstance"에있는 모든 객체 메소드를 얻었으므로이 메소드가 작동하지 않습니다. 언급 된 메소드 만 볼 수 있습니다. 그 링크에. 이 오류 얻을 :

Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))

내가 어떻게 든 인터페이스에 COMObject 캐스팅해야한다고 생각을하고 나는 방법에 액세스 할 것인가? COMObject에서 인터페이스를 추출 할 수 없으면 리플렉션을 사용하여 메소드를 호출 하시겠습니까? COMObject에서 GetInterfaces(을 시도했지만 아무 것도 반환되지 않습니다.

+0

같은 No Misspelled Assembly Name 시도 뭔가'헤더에 system.Runttime.InteropServices'을 그 코드가 작동 사용하는 것이이 작동하는지 확실하지 오전하지만 가정 ...? 이'Error'에 대한 가장 일반적인 문제는'호출하려고하는 어셈블리 이름'에 오타가 있기 때문입니다 – MethodMan

+0

작동 여부는 확실치 않지만'동적 인 myInstance = Activator.CreateInstance (내 수업); myInstance.CallMethod(); ' – I4V

+0

예. 내가 처음 확인한 내용입니다. 어셈블리 이름은 IAssembly4 인터페이스로 캐스팅하면 이미 CallMethod()를 호출 할 수 있으므로 올바른 이름이어야합니다. 나는 또한 Reflection을 사용하여 호출하는 메서드의 이름 (CallMethod())을 두 번 확인했습니다. 또한 InvokeMember와 InvokeMethod가이 경우 왜 다른지 링크에서 언급하지 않습니다. –

답변

0

난 당신이

Type myClass = Type.GetTypeFromProgID("Net4Assembly.Assembly4"); 
object myInstance = Activator.CreateInstance(myClass); 
//object[] arguments = new object[] //add parameters if youre assembly expects them here 
object result = myClass .InvokeMember("SubtractTwoNumbers", BindingFlags.InvokeMethod, 
    null, myInstance, arguments); 
+0

흠 ... 그건 작동하지 않습니다. –

+0

어셈블리 이름이 정확한지 확인했습니다. 케이스가 정확한지 확인하십시오. 왜 작동하지 않는지 확신 할 수 없습니다.이 작업은 수행하려는 작업을 수행하는 또 다른 방법입니다. '간단하게 시작합니다 .' 예를 들어'assembly'의 이름을 두 번 확인해보십시오. 파일 이름에'F2 키를 눌러야합니다. '라고 입력하면 코드에 붙여 넣기하면 오타를 걱정할 필요가 없습니다. – MethodMan

+0

문제가 발생했을 때 방법은 인터페이스에서 메서드를 정의했다. 메소드가 공개되지 않게하는 명시 적 구현을 ​​사용 했습니까? 나는 BindingFlags.NonPublic도 사용했고 여전히 메소드에 접근 할 수 없었다! 어쨌든 ... 지금 일하고 있습니다. 도와 주셔서 정말로 고맙습니다. –

관련 문제