문제

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

도움이 되었습니까?

해결책

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

마커스 히지(Marcus Heege)의 작품을 살펴보세요. 전문가 C++/CLI:Visual C++ 프로그래머를 위한 .NET, .NET에서 네이티브 C++와 관리되는 C++를 혼합하는 방법에 대한 많은 유용한 정보를 제공합니다.

다른 팁

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

COM을 사용하고 싶지 않은 이유는 무엇입니까?

이것이 나의 제안이었을 것입니다.COM 상호 운용성은 저에게 정말 잘 작동했으며 C#에서 COM 개체와 인터페이스를 사용했습니다. COM 개체를 참조하기만 하면 런타임 호출 가능 래퍼가 자동으로 생성됩니다.마찬가지로 C# 클래스를 "COM interop에 등록"으로 표시하는 것은 반대 방향으로 작동했습니다.

인터페이스를 C++로 작성하고 매크로를 사용하여 UNIX에서는 표준 cpp 헤더 파일처럼 보이고 Windows에서는 IDL 파일처럼 보이도록 만듭니다(이 방법이 작동하지 않으면 언제든지 Python/Ruby 스크립트를 작성하여 다음에서 IDL을 생성할 수 있습니다). C++ 헤더 파일).

IDL을 컴파일하여 typelib를 생성합니다.TypeLib Importer를 사용하여 C#에 대한 인터페이스 정의를 생성하고 거기에 인터페이스를 구현합니다.

IDL에 인터페이스를 작성하고 도구를 사용하여 인터페이스를 대상 언어로 컴파일합니다.언어 간 인터페이스와 관련된 CORBA를 살펴보면 이에 대한 지침을 찾을 수 있습니다.

/앨런

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

x86에서는 호출 규칙에 주의하세요.아마도 명시적으로 사용을 선언하는 것 같습니다. __stdcall 또는 __cdecl.P/Invoke는 주로 Windows API를 호출하는 데 사용되므로 기본적으로 StdCall로 설정되지만 C 및 C++에서는 varargs를 지원하므로 기본적으로 cdecl로 설정됩니다.

최근에 COM 인터페이스를 래핑했습니다. IRapiStream 플랫 C 인터페이스에서는 .NET이 IStream을 스토리지로 변환하려고 시도하는 것처럼 보였지만 오류로 인해 실패했습니다. STG_E_UNIMPLEMENTEDFUNCTION.

어떤 버전의 .NET을 사용하고 있는지 언급하지 않았지만 Visual Studio .NET 2003을 사용할 때 저에게 효과적이었던 것은 실제 C++ 클래스의 간단한 구현 주위에 얇은 C# 래퍼를 제공하는 것이었습니다.

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

private:
   MyClass __nogc *native_ptr_;
};

분명히 Boost shared_ptr을 사용하는 것을 선호하지만 V.NET 2003에서 제대로 작동하도록 할 수는 없습니다...

메서드는 단순히 포인터를 통해 기본 C++ 메서드로 전달됩니다.메서드 인수를 변환해야 할 수도 있습니다.예를 들어 문자열을 사용하는 C++ 메서드를 호출하려면 C# 메서드는 System.String(Managed C++의 System::String)을 사용해야 합니다.이를 수행하려면 System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi()를 사용해야 합니다.

이 접근 방식의 한 가지 좋은 점은 Managed C++가 .NET 언어이기 때문에 접근자를 속성(__property)으로 노출할 수 있다는 것입니다.C#에서와 마찬가지로 속성을 노출할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top