2013-04-04 3 views
14

저는 C++로 구현 된 꽤 큰 시스템을 가지고 있습니다. 이 시스템은 상당히 큰 API와 수많은 C++ DLL을 가지고 있습니다. 이러한 DLL은 멋진 C 스타일 API와 달리 C++ 클래스를 내 보냅니다. 그리고 새로운 C# 프로젝트에서 사용해야합니다. - 단지 C API를 C에서 API를 호출하는 방법 #

  • COM에서 작동
  • C++/CLI
  • 객체

    1. P/호출 : 나는 .NET을 알고에서

      는 기본 소프트웨어와 상호 작용의 세 가지 방법이있다

      내가 이해하는대로, 그에 따라 세 가지 접근법이 있습니다 :

      1. C에 랩퍼 작성 W P/Invoke로 호출. 너무 많은 일이있는 것처럼 보입니다.
      2. COM을 사용하여 래퍼 작성. 나는 그것을하는 법을 모르며, 미친 듯이 쉽지 않은 한, 나는 죽어가는 기술이 무엇인지를 배우는 것을 꺼려합니다.
      3. C++/CLI에서 래퍼 작성. 그래도 여전히 가장 적은 일로 보입니다.

      내 질문 :

      1. 내가 알고 싶습니다 우선 왜 .NET 나를 단순히 "있는 그대로"C++ 클래스를 사용하는 것을 허용하지 않습니다? 나는 그것이 기억의 문제라고 가정한다. 경영. 그리고 만약 그것이라면 finalizer를 쓰는 것보다 더 많은 것이고, 그리고 IDisposable을 구현하고 있습니다. 내가 알고있는 C++ 클래스는 단지 이며, P/Invoke는 구조체를 지원하고 함수가 인데 첫 번째 매개 변수로 구조체를 사용하는 이유는 무엇입니까? 클래스를 지원하지 않으시겠습니까?

      2. 둘째, 내가 게으르다는 것과 그 지루하고 지루한 많은 것을 가정하면 이 작동합니까? 이러한 DLL을 사용하는 가장 좋은 방법은 무엇입니까? C#에서 직접 호출하는 가능성이 가장 좋습니다. 그렇지 않다면 포장재를 생산하는 자동 도구가 좋을 것입니다. 또한 DLL은 으로 변경 될 수도 있지만 약간은 그렇지만 여전히 ID가 아닌 은 수동으로 래퍼를 다시 작성해야합니다.

      3. 정말 좋은 답변

      , 특히 첫 번째 부분, 또는 좋은 자동 공구에, 내가 현상금을 보상거야 ...

    +0

    1. 나의 오래된 대답을 참조하십시오 SWIG

    입니다. –

    +2

    http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –

    +0

    나는 C++/CLI가 좋을 것이라고 생각한다. C++로이 작업을 수행 한 경험이있는 것은 아닙니다. – chris

    답변

    6

    게으른 방법을 사용하고자한다면 C++ 래퍼를 생성하는 도구를 사용하는 것이 좋습니다. 물론 의 이러한 래퍼를 생성하기위한 도구는 다른 DLL의 다른 호출 규칙을 가지고 있기 때문에 similar question

    +0

    SWIG 제안에 대한 답변을 수락합니다. 우리는 C 래퍼에 P/Invoke를 사용하게되었습니다. –

    0

    내가 알고있는 방법 주셔서 감사합니다 C++에서 클래스의 메서드에 대한 호출 규칙은 상당히 복잡합니다. 링커에서 사용하는 .LIB 파일 수준에서 함수 이름은 "장식"됩니다 (예 : Name mangling 참조). 또한 메모리에있는 클래스 변수의 레이아웃은 아마도 C#에 비해 C++의 모든 다른 구현간에 다를 수 있습니다. 따라서 Interop Marshaling은 큰 주제입니다. 그래서 내 생각에 Microsoft는 저수준 문제가 너무 많아서 가치가 떨어지는 것으로 판단하기에는 너무 어려웠습니다.

    P/Invoke와 COM 개체를 모두 사용하여 C#을 C++에 연결했지만 C++/CLI를 사용하지 않았습니다. 나는 COM에서 수년간 놀고 있었고, 그것은 자신의 언어와 매우 흡사합니다.따라서 COM을 한 번도 해본 적이 없다면이 단계에서 배우는 것이 가치가 없다고 생각합니다. C++/CLI를 사용하면 C 인터페이스를 통해 모든 것을 쥐어 짜는 대신 객체에 대한 인터페이스를 제공 할 수 있다면 가장 좋은 방법이라고 생각합니다.

    관련 문제