2009-02-20 5 views
42

에서 C++ 클래스 DLL을 사용하여 나는 그것의 인터페이스로 관리되지 않는 C 단지 하나의 클래스 수출 ++ DLL (안 COM을 ... 그것은 그냥 간단한 C++ 클래스)를 가지고있다. C#에서이 클래스를 사용하려고하지만 C#으로 가져올 수 없다는 말을 듣고 있습니다.C# 응용 프로그램

내 C# 응용 프로그램에서이 클래스를 사용하는 올바른 방법은 무엇입니까?

+1

COM 클래스입니까? –

+1

미안하지만 더 구체적이어야했습니다. 이것은 COM 클래스가 아닙니다. 그것은 단순한 오래된 C++ 클래스입니다. – cjserio

답변

43

간단한 방법으로 가정 클래스 푸 :

  1. 이하는 C++/CLI 프로젝트를 만들고이 FooWrapper를 호출합니다.
  2. 만들기 FooWrapper은 (그러나 평소) 관리되지 않는 DLL에 따라 달라집니다.
  3. Foo * 유형의 단일 개인 인스턴스 필드를 포함하는 ManagedFoo 관리 클래스를 작성하십시오.
  4. 은 기본 인스턴스 필드로 전달하는 ManagedFoo에서 공용 배치 기능을 제공합니다. (권장하지만)
  5. 선택적 :
    • 변환 C++ 숙어 (표준 : : 문자열이나 숯불 *)
    • 캐치되지 않는 예외 .NET 숙어 (문자열 등)에서 파라미터를 던져 관리들 대신
    • 그런 다음

당신은 일반적으로 충분합니다 당신의 C# 코드가 FooWrapper 프로젝트/DLL에 의존하고 관리되지 않는 LL이 제대로 그 수행하는 방법, 그것으로 배치 관리되지 않는 DLL에 있지만 같은 디렉토리에 달려 있는지 확인하기 .

기능이 클래스의 인스턴스에 의존하지 않는 경우에도 간단 P/

+0

OP가 문자열이나 예외를 다루는 경우 (5) 선택적으로 호출하지 않습니다. –

+0

C++ DLL 레이어를 없애고 DLL 및 래퍼 모두에 C++/CLI 프로젝트를 만들려면 어떻게해야합니까? 더 구체적으로 말하자면, 현재의 C++ DLL은 여러 개의 정적 라이브러리를 멋진 인터페이스로 연결합니다. C++/CLI 프로젝트에서이 모든 작업을 수행 할 수 있습니까? – cjserio

+0

예이 C++/CLI에서 모두 수행 할 수 있습니다. – ShuggyCoUk

2

당신은 관리/관리되지 않는 경계를 해소하기 위해 프록시 (GoF의 패턴) 중간 필요 호출합니다.

두 가지 옵션 :

  • C++/CLI 래퍼
  • 의 COM 래퍼. > COM - -> .NET

더 많은 직접적인 될 것입니다 전, 그리고 후자는 두 단계 순수 C++이있다.

+0

두번째 option.thanks – rsjethani

+0

에 대한 몇 가지 링크/정보를 제공해 주실 수 있겠습니까? @rsjethani : 저는 아무 것도 할 필요가 없습니다. COM 래퍼를 만드는 것은 원시 (native) COM을 작성하는 것을 의미합니다. 그런 다음'implib'을 사용하여 .NET 용 래퍼를 만듭니다. – Richard

8

이 대답은 하나의 클래스 라이브러리에 대한 과잉 될 수도 있지만 꿀꺽 꿀꺽 다른 언어에서 사용하기에 "포장"C/C++ 클래스에 대한 좋은 솔루션입니다. 그것은 C#에서 잘 작동합니다.

http://www.swig.org/을 참조하십시오.

3

같이 DllImport는 당신의 최선의 방법이다. 약간의 데이터 유형 마사지가 있습니다. 특히 구조체를 전달하는 경우에는 특히 그렇지만 거의 모든 작업을 수행 할 수 있습니다.

2

경우에, 당신의 자신의 C 인터페이스를 제공하는 것이 더 쉽습니다. SWIG은 설치하기가 쉽지 않습니다. 나는 C + + 및 C + +/CLI를 사용하여 관리하고 그들은 괜찮습니다. 가장 쉬운 방법은 C 래퍼를 사용하는 것뿐이었고 (대부분 C 함수를 호출하는 방법이 있으므로 다른 언어로도 사용할 수 있습니다).