簡體   English   中英

將指向C#結構的指針發送到C ++ DLL

[英]Sending pointer to C# struct into C++ DLL

我在DLL中有一個C ++函數,該函數需要一個指向JPInfo結構的指針,該函數在該函數中填充了從服務器接收到的數據,C ++結構的布局如下所示:

typedef struct JP
{
    unsigned char type;
    DWORD value;
} JP;

typedef struct JPInfo
{
    JP jps[3];
    _int16 ConT;
    _int16 CallT;
    unsigned char ret;
    unsigned char count;
    unsigned char JPOffset;
    unsigned char JPPeriod;
} JPInfo;

該函數將在DLL中導出,如下所示:

__declspec(dllexport) DWORD __stdcall GetJPInfo(JPInfo* jpi, DWORD time);

該函數需要一個指向JPInfo結構的指針,我嘗試在C#中模擬此結構

[StructLayout(LayoutKind.Sequential, Size = 5), Serializable]
public struct JP
{
    byte type;
    int value;
}

[StructLayout(LayoutKind.Sequential,Size=23),Serializable]
public struct JPInfo
{
    JP[] jps;
    Int16 ConT;
    Int16 CallT;
    byte ret;
    byte count;
    byte JPOffset;
    byte JPPeriod;
}

我試圖像這樣從C#調用函數:

[DllImport("DLLImp.dll")]
    unsafe public static extern int GetJP(ref JPInfo jpi, int time);
// then in main...
JPInfo jpi = new JPInfo;
GetJackpotValues(ref jpi, 4000);

我收到類型為“ System.ExecutionEngineException”的未處理異常。 我的JPInfo結構中沒有固定大小的JP結構數組,因此我不知道該如何處理。

謝謝。

您是否嘗試過刪除結構上的Size屬性? 做類似的事情時,我不必指定大小。 對於數組屬性,請嘗試按以下方式進行歸因:

[StructLayout(LayoutKind.Sequential)]
public struct JPInfo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    JP[] jps;
    Int16 ConT;
    Int16 CallT;
    byte ret;
    byte count;
    byte JPOffset;
    byte JPPeriod;
}

假設打包了C ++結構,您的C#結構應如下所示:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct JP
{
    byte type;
    uint value;
}

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct JPInfo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
    JP[] jps;
    Int16 ConT;
    Int16 CallT;
    byte ret;
    byte count;
    byte JPOffset;
    byte JPPeriod;
}

另一方面,如果未打包,則將StructLayout屬性的Pack參數刪除。 您應該在C ++頭文件中查找#pragma pack語句,以了解是否打包了C ++結構。

我猜想C ++結構是打包的,因為您說過它們被映射到從服務器接收的數據上。

您的導入應如下所示:

[DllImport("DLLImp.dll")]
public static extern uint GetJP(ref JPInfo jpi, uint time);

DWORD轉換為uint而不是int並且這里不需要不安全的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM