2010-01-14 5 views
0

C++ COM 인터페이스의 C# 구현이 있습니다. 가능한 한 정확하게 IDL (인터페이스)을 이식했습니다.C# COM 인터페이스 구현 문제를 해결할 수 있습니까?

C++ 응용 프로그램이 내 개체를 인스턴스화하면 메서드 중 하나가 성공적으로 호출됩니다. 그런 다음 다른 메소드를 호출하려고 시도하지만 아무 일도 일어나지 않습니다. 두 번째 호출의 실행 경로는 C# 측에 도달하지 않습니다.

나는 C++ exe 코드에 액세스 할 수 없습니다. 컴파일 된 C++ 버전의 COM DLL 개체 코드가 있습니다. 이것은 내가 C#에서 대체하려고하는 것입니다.

차이점이 있는지 확인하기 위해 C++ COM 및 C# COM DLL의 인터페이스를 비교하는 데 사용할 수있는 항목은 무엇입니까? 이것은 가능한가? Microsoft에서 OLE보기를 시도했지만 C++ DLL을 열지 못했습니다. 내 DLL이 C++과 똑같아 보일 것 같아 보인다.

이 질문은 여기에서 내가 어디로 갈 수 있는지 이해하는 데 도움이됩니다. 내가 달성하고자하는 정확한 구현에 대해 매우 자세한 질문을했지만 아무도 관심이 없다. 이것이 제가 답변으로 안내하는 데 도움이되는보다 일반적인 질문을 게시하는 이유입니다.

정말 붙어 있습니다. 25 시간 이상이 이미 ㅎ에 갔다.

답변

0

내 호환성 문제를 해결 한 후 C++ dll이 예상했던 인터페이스 항목을 노출하지 않는다는 것을 발견했습니다. 이 질문은 2 DLL의 노출 된 인터페이스를 디버깅하거나 비교하는 방법을 목표로했지만 필자는 [ComVisible (true)] 대신 구현하고있는 C# 인터페이스의 [ComImport] 특성을 사용하여 프로젝트를 진행했습니다. 호환성을 강화하기 위해 인터페이스 선언에 [PreserveSig] 특성을 사용했습니다. 이것은 무슨 일이 일어나고 있는지에 대한 나의 이해입니다.

0

InterfaceTypeAttribute를 사용하여 C# 인터페이스를 표시하여 IUnknown 또는 IDispatch로 마샬링해야한다고 CLR에 알려 봤습니까?

그렇지 않으면 VMT의 메소드 슬롯이 엉망이되기 때문입니다.

+0

예, IDL 당 IUnknown입니다. – Nanook

0

C# 구현을 수행하고 무슨 일이 일어나고 있는지 직접 테스트 응용 프로그램 (C++ 또는 C# 또는 둘 다)을 작성할 수 있다고 생각하지 않습니까? 이미 해본 적이 있다면 언제든지 무시하십시오.

관련 문제