2009-11-18 1 views
1

C#으로 작성된 방대한 라이브러리를 C#으로 액세스 할 수 있도록 포장하는 가장 좋은 방법은 무엇입니까?C++ Wrapper 네이티브 Interop 엔터프라이즈 스케일

나는 interop을 사용하여 작업을 완료했으며, IJW를 좋아합니다. 그러나 거대한 도서관에서이 접근법을 구현하는 방법에 대해서는 확신 할 수 없습니다. 사용할 패턴이 있는지 궁금합니다. 그렇지 않으면 실제로 관리 할 수없는 C++ 라이브러리에있는 모든 클래스를 래퍼 (wrapper)로 작성해야합니다.

또한 라이브러리에 단일 외장을 제공 할 수는 없지만이 시점에서 매우 크고 압도적이기 때문에 어떤 아이디어라도 크게 감상 할 수 있습니다.

답변

0

성능이 가장 중요한 관심사 인 경우 IJW로 있습니다. 래퍼 클래스를 작성하거나 코드에서 가독성을 높이려면 코드 생성에 도움이되는 IDE 마법사가 있고 COM을 기본 클라이언트에서 사용할 수 있으므로 COM 래퍼를 만드는 것이 좋습니다. 이것이 Microsoft가 Office 및 IE 용 API를 공개하는 방식입니다.

0

나는 당신이 설명하는 것과 비슷한 과정을 겪어왔다. 우리 상황에서는 클래스를 감쌀 수있는 쉬운 방법이 없었기 때문에 (IJW는 대형 C++ 라이브러리에서 사용할 수있는 솔루션이 아닙니다) 은 모든 클래스를으로 마무리했습니다.

우리는 애플 리케이션에서 소비해야 할 핵심 클래스 주위에 래퍼를 작성하고 필요에 따라 다른 클래스의 래퍼를 추가했다. 특히 이러한 점이 우리를 도왔습니다 :

  • 래퍼 계층에서 우리는 C++ 코드와 .NET 개념 사이에서 변환 할 수 있도록 매크로를 많이 사용했습니다. 예 : 매크로는 '속성'유형의 메소드를 실제 .NET 속성으로 변환하는 데 사용되었습니다.
  • 우리는 항상 native C++ 클래스를 "property IntPtr NativeObject {get();}"을 사용하여 IntPtr로 노출했습니다. 이를 통해 래퍼 객체가 여러 객체로 전달되도록 허용하면서 래퍼를 여러 구성 요소로 분할 할 수있었습니다.
  • 모든 것이 예상대로 작동했는지 확인하기 위해 철저한 테스트가 필요합니다.

가 포함 된 많은 작업이지만, 모든 클래스 주위에 래퍼를 작성하는 관리이지만, (분명히)에만 가치가 충분한 이익을 얻는 경우에 동안. 래퍼를 "손으로"작성하면 프로젝트의 성공에 필수적인 interop에 대한 세분화 된 제어권을 얻을 수있었습니다.