2010-06-30 4 views
11

C#과 C++ 간의 상호 운용 방법을 찾는 과정에서 P/Invoke에 대해 설명하는 article을 발견했습니다.C++ 및 C# 상호 운용성 : P/Invoke vs C++/CLI

그리고 나는 C++/CLI가 정확한 C++가 아니며 원래의 C++ 코드를 수정하려고 노력해야한다고 주장하는 기사를 많이 읽었습니다.

C# 개체에서 사용할 C++ 개체 (코드/데이터)가있을 때 최적의 방법이 무엇인지 물어보고 싶습니다.

  • P/Invoke를 사용하려면 C 스타일 API를 제공해야합니다. 사실입니까? 내 말은, P/Invoke를 사용하여 SWIG처럼 C++ 객체를 C#으로 내보내는 방법이 있습니까? 또는이 목적으로 SWIG를 사용해야합니까?
  • C++에서 C++/CLI로 변경하는 것이 얼마나 어렵습니까? C#을 C++로 다시 작성하는 것과 비교해 볼 가치가 있습니까? C++은 잘 설계되어 있으므로 C#으로 구현하는 것은 그리 큰 문제가 아닙니다.
  • (주제 끄기 질문) 다른 방법이 있습니까? C++에서 C# 코드를 사용하고 싶다면 그렇게 할 방법이 있습니까?

답변

18

C++/CLI에 C++ 라이브러리를 다시 쓰지 않는 것이 좋습니다. 대신 C#에서 호출 할 수있는 C++/CLI 래퍼를 작성합니다. 이것은 일부 public ref class 클래스로 구성되며, 각 클래스는 아마도 원시 클래스의 인스턴스를 관리합니다. C++/CLI 래퍼는 기본 라이브러리를 사용하기 위해 "헤더에 lib에 링크"를 포함합니다. public ref class 클래스를 작성 했으므로 C# 코드는 .NET 참조를 추가하기 만합니다. 그리고 각 공용 참조 클래스에서 수행하는 작업은 C++ Interop (일명 It Just Works interop)를 사용하여 원시 코드를 호출하는 것입니다. 원하는 경우 외관에 적용 할 수 있습니다.

+4

+1 절대적으로. 일반적으로 기존 C++ 코드를 수정하지 않아도됩니다. –

3

Kate Gregory의 답은 C++에서 C# 코드를 호출하기 위해 C++/CLI를 사용하는 것이 매우 간단하고 매끄럽게하기 때문에 명백한 방법입니다.

5

C++/CLI 구문은 어색하지만 C++ 코드에서 관리되는 개체를 노출 할 수 있습니다. 이것은 대용량의 C++ API를 보유하고 있고 관리 코드에서 사용하기 위해 간단한 인터페이스로 그 기능 중 일부를 추상화 할 수 있으면 편리 할 수 ​​있습니다. 필자는 Matrox 비전 라이브러리와 같은 도구와의 통합을 성공적으로 완료했습니다. 여기서 비전 분석 코드를 C++로 작성한 다음 C++/CLI 확장을 사용하여 상위 관리 클래스를 노출합니다. 가장 고통스러운 부분은 아마도 문자열과 배열 inter-op이지만 문자열은 항상 평범한 C++에서도 고통 스럽습니다.

C++/CLI는 .NET 관리 객체를 확실히 소비 할 수 있지만 관리 메모리에 대한 포인터를 사용하는 경우 특히주의해야합니다.이 경우에는 고정을 사용해야합니다. API에 대한 포인터를 전달할 때는 대개 해당 메모리를 관리되지 않는 상태로 유지 한 다음 관리되지 않는 메모리를 조작하기 위해 관리되는 래퍼 클래스를 만드는 것이 좋습니다.

0

C++ 네이티브 클래스를 구현 포인터로 C++/CLI 클래스에 래핑 한 다음 &을 .net 응용 프로그램에서 'using'을 사용하여이 클래스를 사용하십시오. 이것은 내가 권장하는 방법입니다. C++/CLI에서 기존 클래스를 다시 작성하지 마십시오.