2012-04-04 6 views
5

우리는 주로 C# (서비스, 멀티 스레딩 등)으로 작성된 큰 프로젝트를 가지고 있습니다. 그러나 코어 번호 크 런칭 알고리즘은 언 매니지드 C++로 작성되어 고속 (OpenMP 등)입니다.비 관리 C++ 코드에서 C# 속성 사용

현재 불행히도 우리는이 두 세계간에 데이터를 교환하기 위해 많은 노력을 기울여야합니다. 즉, 각 C++ 클래스에 대해 C++/CLI로 래핑 클래스를 작성해야합니다. (사실상) C#에서 필요한 설정 (속성) - "세계"에는 C++ 세계 (헤더 파일)에 복사본이 있고 래퍼 클래스에서 앞뒤로 명시적인 변환이 있습니다. 이 아키텍처는 매우 비효율적이며 오류가 발생하기 쉽습니다.

기본 질문 : 언젠가 자동으로 비 관리 C++에서 속성을 사용하여 C# 클래스를 공유 할 수 있습니까? (우리는 읽고해야만합니다!)

보조 질문 : 위와 같은 경우에 아키텍처를 개선하는 방법에 대한 조언을 해 줄 수 있습니까? 우리의 고려 사항 중 하나는 C++로 완전히 전환하는 것이었지만 적절한 라이브러리를 찾고 .NET에서 현재 (시스템 -) 모든 작업에 대해 깨끗한 코드를 작성해야하는 것은 좋지 않습니다. 당신의 도움 및 안부, 야콥에 대한

많은 감사

내 차 작업이 특정 높은 perfromance, 낮은 대기 시간 DLL을 관리 인터페이스를 작성하는 것입니다 내 직장에서 비슷한 문제를 처리하고
+0

C#에서 알고리즘을 작성하는 것이 병목 현상이라고 확인 했습니까? C# 4.0은 병렬 개발을 지원합니다. – Nick

+0

아니요, 아직이 작업을 수행하지 않았습니다. 그리고 당신이 옳습니다. 우리는이 점에 대해 확신을 주어야합니다. 그러나 메모리 캐싱과 같은 특정 속성에 의존하기 때문에 알고리즘이 CLR에서 비슷한 속도로 실행될 것입니다. –

+2

[프로토콜 버퍼] (http://code.google.com/p/protobuf/)는 어떻습니까? [protobuf-net] (http://code.google.com/p/protobuf-net/)을 사용하여 C#과 함께 사용할 수 있습니다. – megabyte1024

답변

1

,이 간단한 경우를 포함한다 네이티브 클래스에 원시 포인터가 포함 된 간단한 C++/cli를 사용하여 네이티브 클래스를 래핑해야하는 경우 또는 네이티브 코드가 서버 쪽 게시자이고 관리 코드가 대리자를 사용하여 구독해야하는 경우보다 복잡한 문제 네이티브 콜백으로 변환. .NET은 내가 아는 한 정교한 COM 서버입니다. ComVisible 특성이 true로 설정된 .net 어셈블리를 작성할 수 있으며 고전적인 COM 구성 요소로 작동 한 다음 네이티브 C++ 코드에서 COM 구성 요소로 사용할 수 있습니다. 관리에서 네이티브 코드를 사용하는 반대는 DllImport 특성을 사용하여 수행 할 수 있으며 모든 마샬링은 StructLayoutAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx) 및 MarshalAsAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx)와 같은 다양한 특성으로 미세 조정할 수 있습니다. 때때로 안전하지 않은 키워드 게다가. 고성능 코드를 처리해야하므로 어떤 경우에는 가장 좋은 솔루션인지 프로파일 링 한 후에 그 코드를 처리해야합니다. 언급 한 워퍼 클래스 솔루션이든 클래식 COM 방식이든, 또는 일부 캐싱, 개체 풀링 등과 같은 종류의 하이브리드 일 수 있습니다.

희망이 있습니다. :)

약간 혼란 스러울 경우 사과드립니다. 아주 늦었습니다. :)

+0

답해 주셔서 감사합니다. Marhsal.StructToPtr 및 동반자를 사용하여 래퍼 코드를 이미 정리 했으므로 C# 및 네이티브 C++ 환경에서 C++/CLI 구성 요소를 사용하여 더 멀리 나아갈 수 있기를 바랍니다. –

+0

감사합니다. Jakob 에스. – ervinbosenbacher