이 작업을 수행하는 가장 좋은 방법은 무엇입니까? ...?네이티브 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은 가장 융통성있는 옵션처럼 보일 수 있지만 잠재적 인 함정에 대해 다른 관점을 얻고 싶습니다.