2010-02-08 54 views
1

我有一個.DLL和一個.h文件。我使用的是C#,但.DLL是用C++編寫的。我必須在.DLL中調用某個函數時遇到問題。問題出現在我需要調用其中定義類型的函數時。例如包括與.DLL是.h文件,它有像中定義的類型如下:在C#中定義C++類型

struct device_info { 
    HANDLE dev_handle; // valid open handle or NULL 
    wchar_t* product_string;  // malloc'd string or NULL 
    wchar_t* serial_string;  // malloc'd string or NULL 
}; 
typedef struct device_info *PDEV_INFO; 

我試圖運行它和產生像這樣的結構:

[StructLayout(LayoutKind.Sequential)] public struct PDEV_INFO 
{ 
     unsafe void* dev_handle; 
     unsafe char* product_string; 
     unsafe char* serial_string; 

} 

我的節目只是崩潰,我嘗試使用任何這些類型。我將如何在C#中定義這些類型,或者如何從.h文件中引用類型?更好的是在.DLL某處定義的類型,我只是不知道。謝謝。

+0

? – Ondergetekende 2010-02-08 18:20:45

回答

3

嘗試IntPtr而不是指針。 IntPtr是爲編組而設計的,c#指針不是。 此外,你可能想要閱讀字符串編組。你真的不需要自己做。

嘗試宣告你的類型爲:你如何使用這些類型

[StructLayout(LayoutKind.Sequential)] 
public struct PDEV_INFO 
{ 
     IntPtr dev_handle; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     String product_string; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     String serial_string; 

} 
+0

所以像這樣: [StructLayout(LayoutKind.Sequential)] public struct PDEV_INFO { unsafe IntPtr * dev_handle; 不安全的IntPtr * product_string; 不安全的IntPtr * serial_string; } – rross 2010-02-08 18:23:30

+1

不,沒有指針。指針非常不合適 - 你應該(幾乎)總是避免它們。我已經更新了我的答案給你一個想法。 – Ondergetekende 2010-02-08 18:29:27