我嘗試在我的C#代碼以使用C++ DLL。
所讀取的所有數據必須被傳遞到DLL作爲一個指針結構。我的第一個想法是隻保留一些非託管內存,傳遞函數指針和事後提取數據。問題是這些函數只會返回一個錯誤代碼,該代碼會轉換爲「參數無效」。C#通指向struct(含有非Blittable型)非託管C++ DLL
從DLL文件頭(結果和BusPortId縮短)
typedef enum {
BUS_COM1 = 0x01, // 2 to 15 ommited
BUS_COM16 = 0x10,
BUS_USB1 = 0x101, // 2 to 15 ommited
BUS_USB16 = 0x110
} BusPortId;
typedef enum {
BUS_SUCCESS = 0, //!< The operation was completed successfully
BUS_ERROR = 0x100, //!< An error occured
BUS_INVALIDARG = 0x1000, //!< An argument is not valid
} Result
struct BusPortInfo
{
ULONG portInfoSize;
CHAR portText[64];
BOOL portLocked;
BusPortId portId;
};
Result BUSDRV_API busGetAvailablePortCount(ULONG *retCount);
Result BUSDRV_API busGetAvailablePort(ULONG index, BusPortInfo *portInfo);
我的C#程序的相關部分,到目前爲止
enum BusPortId
{
BUS_COM1 = 0x01, // 2 to 15 ommited
BUS_COM16 = 0x10,
BUS_USB1 = 0x101, // 2 to 15 ommited
BUS_USB16 = 0x110
};
public enum Result
{
BUS_SUCCESS = 0, //!< The operation was completed successfully
BUS_ERROR = 0x100, //!< An error occured
BUS_INVALIDARG = 0x1000, //!< An argument is not valid
};
struct BusPortInfo
{
public ULONG portInfoSize;
unsafe public fixed char portText[64];
public BOOL portLocked;
public BusPortId portId;
}
[DllImport(DLL_Path)]
unsafe static extern Result busGetAvailablePortCount(ULONG* retCount);
[DllImport(DLL_Path)]
unsafe static extern Result busGetAvailablePort(ULONG index, BusPortInfo* portInfo);
ulong count= 0;
Result res = busGetAvailablePortCount(&count);
ulong index = 0;
BusPortInfo info = new BusPortInfo();
Result res = busGetAvailablePort(0, &info);
到busGetAvailablePortCount(或其他類似功能)呼叫工作沒有任何問題。但是,當我打電話busGetAvailablePort我得到了我的控制檯輸出以下
Cannot marshal 'parameter #2': Pointers cannot reference marshaled structures. Use ByRef instead.
的問題是,我可以改變我的結構在C#中,這樣我可以通過指針,但隨後從DLL中的函數也返回「一種說法是無效」
我有什麼做我的結構,所以我可以將指針傳遞給它的功能同時還獲得由DLL接受?
P.S.對不起英語不好,我不是母語的人。