2013-06-28 1 views
0

이 메시지가 표시되면 제 사과를 수락하십시오. 나는 주제에 대해 많은 것을 찾지 못하고있다. Primitive types pass template parameter between c++ and CLI도 비슷한 질문입니다. 조금만 알아 봤지만별로 유익하지 않았습니다.C#/NET 용 C++/CLI에서 관리되지 않는 C++ 템플릿 랩핑

나는 템플릿 클래스를 노출하는 네이티브 C++ DLL을 가지고 있으며 (C#에서는 인스턴스의 생성을 원한다.) 나는 C#에서 그 유사점을 원했다. 저는 C#에 익숙하지 않지만, 가장 가까운 것은 일반적인 것입니다.

제 문제는 C++/CLI 템플릿/generic에 C++ 템플릿을 래핑하여 C#에서 사용할 수 있도록하는 방법입니다.

  1. 심지어 가능합니까? CLI 랩퍼가 관리되지 않는 알 수없는 유형 T을 C# 소비의 관리 유형으로 마샬링하는 방법을 알지 못하기 때문에 이것이 불가능하다고 생각합니다.

  2. 가능한 경우 어떻게해야합니까? 그렇지 않은 경우 비슷한 상황에서 사용할 수있는 일반적인 전략은 무엇입니까?

감사합니다.

+0

C++ 템플릿은 컴파일 할 때 인스턴스화됩니다. 관리 코드에서 사용할 수있는 유일한 방법은 C++ 컴파일러를 실행하는 것입니다. 이것은 실용적이지 않습니다. C++/CLI에서 * generic * 키워드를 사용하여 런타임에 인스턴스화되는 제네릭 형식을 선언합니다. –

답변

1

당신이 관리되지 않는 C++에 대해 이야기하고 있다고 가정하면 실제로는 불가능합니다.

일반적으로 관리되지 않는 C++에서 복잡한 것을 C#으로 전달하는 것은 어려운 일입니다.

가장 쉬운 방법은 관리되는 코드와 관리되지 않는 코드간에 데이터를 전달하는 데 사용할 수있는 C++로 간단한 구조체를 작성하는 것입니다. (즉, 데이터 전송 객체.)

그 다음 C++ 방법을 감싸고있는 (즉, 네임 맹 글링 C++ 서명 대신 C 서명을 사용) 단독 함수를 작성하고, 대신 C 번호로부터의 래퍼 함수를 ​​호출한다.

나는 이것을 몇 번 해봤지만 C#에서 관리되지 않는 C++ 함수를 호출하는 것보다 훨씬 관리하기 쉽습니다!

+0

답장을 보내 주셔서 감사합니다. 예, 관리되지 않는 C++입니다. (편집에서 이것을 명확히했습니다). 따라서 솔루션에서 관리되는 C++ 래퍼를 완전히 무시합니까? –

+0

@ KristianD'Amato 예, 내 코드에서 C 함수로 모든 C++ 항목을 래핑하고 복잡한 C++ 클래스에서 필요한 데이터를 매우 간단한 C 구조체로 복사했습니다. –

2

템플릿 클래스가 DLL에서 이미 내보내 졌으므로 인스턴스화 된 템플릿 클래스임을 의미합니다.

인스턴스화 된 C++ 클래스는 일반 C++ 클래스와 P/Invoke의 관점에서 차이가 없습니다. 인스턴스화 된 템플릿 클래스를 호출하는 것은 C++/CLI를 사용하지 않고 직접 C#에서 가능하고 실행할 수 있지만 래퍼 코드를 직접 작성하는 데는 많은 시간이 소요됩니다.

C# pinvoke marshalling structure containg vector<structure>에서 stackoverflow를 수동으로 수행하는 방법을 공유했지만이 방법으로 수동으로 래퍼 클래스를 작성하는 데 너무 많은 시간이 필요합니다. 노력할 가치가 없을 수도 있습니다.

내가 작성한 도구 xInterop NGen++은 템플릿 클래스의 C# 래퍼 클래스를 생성 할 수 있습니다. 전통적인 C++ 응용 프로그램에서 동일한 DLL을 사용할 수있는 한 네이티브 C++ DLL에서 내 보낸 C++ 클래스에 대한 래퍼 클래스를 생성 할 수 있습니다.

내 블로그 웹 사이트의 아래 링크에서 세부 정보를 읽을 수 있습니다.

Creating and Accessing Instantiated std::vector Template Class from .NET

Advanced technology to wrap native C++ template class in C# automatically

나는 예산이 우려 경우 가까운 장래에 무료로 특급 버전을 출시 할 계획이 있습니까. 따라서 C++ 템플릿 클래스를 호출 할 필요가있는 작은 프로젝트가 있으면 제한된 기능을 가진 무료 버전을 사용하여 C# 래퍼 클래스를 만들 수 있습니다. 나 또한 생성 된 C# 래퍼 (C# 바인딩)를 몇 가지 오픈 소스 C++ 프로젝트에 릴리스 할 계획이 있습니다. 는 C++/CLI 래퍼에서 이러한 유형> 관리되지 않는 변환 기능 -

는 지원 템플릿 인수 형식의 명시 적 목록을 제공하고자하고 <을 관리하는 경우

+0

나는이 도구를 우리 회사에서 평가 해 왔으며 적용 범위와 사용 사례의 수에 매우 감명 받았습니다. C++에 많은 투자를하고 C#/VB.Net 응용 프로그램에서이 제품을 사용할 수 있어야하는 경우 매우 좋은 제품입니다. –

관련 문제