2010-05-28 3 views
2

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? ...?네이티브 C++ DLL 사용 여부에 대한 조언 : PINVOKE & Marshaling?

HeapAlloc을 사용하여 할당 한 바이트 버퍼와 함께 많은 Win32 호출을 사용하는 일부 원시 C++ 코드가 있습니다. 코드를 확장하고 C# GUI를 만들고 싶습니다. 나중에 기본 Win32 GUI를 사용하십시오 (.Net 및 제한된 MFC 지원이없는 곳에서 사용할 수 있습니다).

(A) 나는 C#에서 코드를 재사용 할 수 있고 여러 개의 PINVOKE를 사용할 수 있습니다 ....하지만 별도의 클래스에서 PINVOKES를 사용하더라도 코드는 모든 마샬링에 지저분 해 보입니다. 또한 많은 코드를 다시 작성합니다.

(B) 네이티브 C++ DLL을 만들고 PINVOKE를 사용하여 원시 데이터 구조를 마샬링 할 수있었습니다. 나는 네이티브 C++ DLL/LIB를 C#을 사용하는 프로젝트에 포함시킬 수 있다고 가정합니다.

(C) 혼합 모드 DLL (기본 C++ 클래스 + 관리 참조 클래스)을 만듭니다. 나는 이것이 C#에서 managed ref 클래스를 사용하는 것을 더 쉽게 만들 것이라고 가정한다. 그러나이 경우인가? 관리되는 클래스가 모든 마샬링을 처리합니까? .Net이없는 플랫폼에서이 혼합 모드 DLL을 사용할 수 있습니까 (즉, 기본 C++ 관리되지 않는 구성 요소에 계속 액세스 할 수 있습니까). 아니면 .NET 전용 플랫폼으로 제한합니까?

이 옵션들 각각에 대해 저를 괴롭히는 한 가지는 모든 마샬링입니다. 관리되는 데이터 구조 (배열, 문자열 등)를 만들고 네이티브 C++ 클래스에 전달하는 것이 더 좋은가?

모범 사례로 간주되는 것에 대한 아이디어 ... ...?

업데이트 : 처음부터 네이티브 C++ 코드를 다시 작성할 수는 있지만 코드를 복제하면 모든 Win32 응용 프로그램에서 코드 업데이트를 쉽게 다시 사용할 수 없습니다. 가장 걱정되는 것은 관리되는 세계와 관리되지 않는 세계 사이의 다양한 데이터를 마샬링하는 가장 좋은 방법입니다. 필자에게 혼합 모드 DLL은 가장 융통성있는 옵션처럼 보일 수 있지만 잠재적 인 함정에 대해 다른 관점을 얻고 싶습니다.

답변

1

.NET을 직접 사용하지 않는 이유는 무엇입니까? 나에게있어 문제는 원래의 네이티브 라이브러리에 의존한다는 사실에서 비롯된 것 같지만 .NET에서 다시 수행 할 수 없다는 점을 언급하지는 않습니다.

. NET- 네이티브 interop와 마찬가지로 PInvoke는 지저분하지만 작동합니다. 원래 DLL을 .NET으로 변경할 수 없으면 함께 갈 것입니다.

0

옵션 C는 마샬링이 간단하고 프레임 워크가 처리하기 쉬운 것으로 판명되면 (옵션이 모두 blittable입니까?) 가장 적은 작업을 제공합니다. 그것은 또한 당신에게 자신의 마샬링을위한 장소를 제공합니다. 나는 날짜 유형 사이에 마샬링하기 전에이 나이에 대해 뭔가를 썼습니다.하지만 오늘은 marshal_as <> 관리되는 유형과 기본 유형 사이에 오버로드를 작성한다고 생각합니다. 가장 우아한 솔루션과 최소한의 코드가 될 것입니다.

업데이트 : 내 오래된 기사를 찾았습니다. - PInvoke에 대한 것이 었습니다. http://codeguru.earthweb.com/columns/kate/article.php/c4867/

관련 문제