2010-05-28 54 views
2

這樣做的最佳方法是什麼....?關於是否使用本地C++ DLL的建議:PINVOKE&Marshaling?

我有一些本地C++代碼,使用大量的Win32調用與字節緩衝區(使用HeapAlloc分配)。我想擴展代碼並創建一個C#GUI ...並且稍後可能會使用基本的Win32 GUI(用於沒有.NET和有限的MFC支持的地方)。 (A)我可以在C#中重新編寫代碼並使用多個PINVOKE ....但即使在單獨的類中使用PINVOKES,代碼也會與所有編組看起來混亂。我也在重寫很多代碼。 (B)我可以創建一個本地C++ DLL並使用PINVOKE來封送原生數據結構。我假設我可以使用C#在一個項目中包含本地C++ DLL/LIB? (C)創建混合模式DLL(Native C++類和託管ref類)。我假設這將使在C#中使用託管的ref類更容易......但是這種情況?託管類將處理所有編組嗎?我可以在沒有.Net的平臺上使用這種混合模式DLL(即仍然訪問本地C++非託管組件)還是僅限於.Net only平臺。

有一件事讓我困擾這些選項中的每一個都是編組。創建一個託管數據結構(數組,字符串等)並將其傳遞給本機C++類還是相反?

關於什麼會被認爲是最佳實踐的任何想法......?

更新: 我知道我可以重新編寫原生C++代碼,但它意味着複製代碼並阻止我輕鬆地重新使用任何代碼更新與任何Win32應用程序。最讓我感興趣的是整理託管和非託管世界之間各種數據的最佳方式。對我而言,混合模式DLL看起來是最靈活的選擇,但我想對潛在的缺陷有不同的看法。

回答

1

爲什麼不直接使用.NET?在我看來,您的問題來自於您依賴原始本地庫的事實,但您並未提及它不能簡單地在.NET中重新完成。

至於.NET本地互操作,PInvoke是混亂的,但它確實有效。如果你不能將原始的DLL改變成.NET,我會這樣做。

0

如果編組結果對於框架來說簡單易行,那麼選項C爲您提供最少的工作(是一切都可以實現的嗎?)。它也給你一個地方掛鉤你自己的編組。我寫了一些關於這個年代以前編組日期類型之間的東西,但我想今天我會在你的託管類型和本地類型之間編寫一個marshal_as <>重載。這將是最優雅的解決方案,也是最少的代碼。

更新:發現我的舊文章 - 這是PInvoke。 http://codeguru.earthweb.com/columns/kate/article.php/c4867/