在我的C#.Net應用程序中,我使用C++ DLL和DllImport。
C++的DLL包含枚舉定義:在.net應用程序崩潰的C++枚舉
enum mode { A, B, C };
class myClass {
char name[512];
mode myMode; //variables beneath this line cause crash
char pass[512];
};
我定義我的C#.NET應用程序相同enum
:
public enum mode { A, B, C };
現在,如果我訪問是myMode
之後定義的myclass
變量行,我得到一個內存損壞錯誤:
getName(); //ok
getPass(); //error
extern "C" LPCTSTR FAR PASCAL EXPORT getPass() { return myC->pass; }
C#包裝:
[DllImport(DLLNAME)]
public static extern string GetPass();
作爲一種變通方法我用int
類型爲myMode
和一切正常。但我很好奇如何做對。
C++枚舉是編譯時的「虛構」(就像內聯函數和模板一樣)。編譯後,它們與整數無法區分。 C++抽象是[特別泄漏](http://www.joelonsoftware.com/articles/LeakyAbstractions.html)。 – pyon 2011-03-29 14:36:03
Ew ... C++中的'char []'真的很醜。順便說一句,可能會有一個緩衝區溢出,因爲'name'長度可能大於512.在這種情況下'name'(和'myMode')之後的所有成員都將被破壞。只是一個建議,沒有看到實際的代碼,但 – maverik 2011-03-29 15:19:29
@maverik:沒有緩衝區溢出。我使用簡單的測試值。 – 2011-03-30 06:54:00