2008-09-15 5 views
5

저는 C++로 정의 된 인터페이스를 C#에서 구현해야합니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 내 인터페이스 정의에서 COM을 전혀 사용하고 싶지 않습니다. 이 문제를 해결 한 방법은 C++과 C#의 두 가지 인터페이스 정의를 사용하는 것입니다. 그런 다음 C# 인터페이스를 COM 서버로 노출합니다. 이것은 C++로 작성된 내 응용 프로그램으로 C#을 호출 할 수 있습니다. 어쨌든 C++뿐만 아니라 C#에서도 구현을 정의하지 않아도 될까요?C# 및 C++로 구현해야하는 C++의 인터페이스를 정의하십시오.

답변

3

C# 대신 관리되는 코드에 C++/CLI를 사용하려는 경우 헤더 파일을 통해 직접 기본 C++ 인터페이스 정의를 사용할 수 있습니다. 이것이 얼마나 쉬운지는 인터페이스에 무엇이 있는지에 달려 있습니다. 가장 간단한 경우는 C에서 사용할 수있는 것입니다.

Marcus Heege의 Expert C++/CLI: .NET for Visual C++ Programmers을 살펴보면 네이티브 및 관리되는 C++을 혼합하는 데 유용한 정보를 얻을 수 있습니다. . NET에서.

+0

Nishant Sivakumar의 C++/CLI in Action이 C++을 C#에 연결하는 방법을 이해하는 데 유용한 자료입니다. – Juba

1

왜 COM을 사용하지 않으시겠습니까?

내 제안이었을 것입니다. COM interop은 정말 잘 돌아 갔고 C#에서는 COM 개체와 인터페이스를 사용했습니다. COM 개체를 참조하면 런타임 호출 가능 래퍼가 자동으로 만들어집니다. 마찬가지로 C# 클래스를 "COM interop에 등록"이라고 표시하는 것은 그 반대의 방법으로 작동합니다.

1

C++로 인터페이스를 작성하고 매크로를 사용하여 UNIX에서는 표준 cpp 헤더 파일처럼 보이게하고 Windows에서는 IDL 파일과 유사하게 만듭니다 (이 방법이 작동하지 않으면 항상 파이썬/루비 스크립트를 작성하여 생성 할 수 있음). C++ 헤더 파일의 IDL).

IDL을 컴파일하여 typelib을 생성하십시오. TypeLib Importer를 사용하여 C# 용 인터페이스 정의를 생성하고 거기에 인터페이스를 구현하십시오.

1

인터페이스를 IDL에 작성하고 도구를 사용하여 인터페이스를 대상 언어로 컴파일하십시오. 교차 언어 인터페이싱에 관심이있는 CORBA를 살펴볼 때이 점에 대한 지침을 찾을 수 있습니다.

/앨런

0

당신의 여드름 투성이의 구현 주위에 얇은 C#을 래퍼를 제공하는 것입니다 당신이 사용하고있는 .NET 있지만 Visual Studio .NET 2003을 사용에 나를 위해 일한 무언가의 버전을 언급하지 않는다 실제 C++ 클래스는 다음 앞으로 단순히 ...

방법을 분명히

public __gc class MyClass_Net { 
public: 
    MyClass_Net() 
     :native_ptr_(new MyClass()) 
    { 
    } 
    ~MyClass_Net() 
    { 
     delete native_ptr_; 
    } 

private: 
    MyClass __nogc *native_ptr_; 
}; 

, 하나는 거기에 부스트 shared_ptr을를 사용하는 것을 선호하지만, 나는 그들이 V.NET 2003 능숙하게 플레이를 할 수 없었다 포인터를 통해 기본 C++ 메소드. 메서드 인수를 변환해야 할 수 있습니다. 예를 들어 문자열을 사용하는 C++ 메서드를 호출하려면 C# 메서드가 System.String (Managed C++에서 System :: String)을 가져야합니다. 이렇게하려면 System :: Runtime :: InteropServices :: Marshal :: StringToHGlobalAnsi()를 사용해야합니다.

Managed C++는 .NET 언어이기 때문에 접근자를 속성 (__property)으로 표시 할 수 있습니다. 심지어 C#에서와 마찬가지로 속성을 노출 할 수도 있습니다.

1

다른 방법은 '플랫'C 스타일 API를 사용하는 것입니다. 우발적 인 과부하를 방지하기 위해 extern "C"을 사용할 수도 있습니다. DEF 파일을 사용하여 명시 적으로 내 보낸 함수의 이름을 지정하면 어떤 방식으로도 장식되지 않습니다 (C++ 함수는 내보내기 테이블의 매개 변수 유형을 인코딩하여 장식됩니다).

x86에서는 호출 규칙을주의하십시오. 아마도 __stdcall 또는 __cdecl의 사용을 명시 적으로 선언해야합니다. P/Invoke는 주로 Windows API를 호출하는 데 사용되므로 StdCall이 기본값이지만 C 및 C++은 기본적으로 varargs를 지원하므로 cdecl이 기본값입니다.

최근 .NET에서 플랫 스트림 C 인터페이스에 COM 인터페이스 IRapiStream을 래핑했습니다. 오류로 인해 실패한 저장소로 IStream을 변환하려고 시도하는 것 같았습니다. STG_E_UNIMPLEMENTEDFUNCTION.

2

Swig은 C#과 같은 다른 언어로 C++ 클래스를 래핑하는 훌륭한 도구입니다.