У меня есть функция C++ в DLL, которая берет указатель на структуру JPInfo, которая в функции заполняется данными, полученными от сервера, макет структуры C++ показано ниже:Отправка указателя на C# struct в C++ DLL
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». Я не могу иметь массив фиксированных размеров структур JP в моей структуре JPInfo, поэтому я не знаю, как подойти к этому.
Спасибо.
Старайтесь не указывать sie явно, а Marshaller по умолчанию делает это. (Размер = 23,5 и т. Д.) – Digvijay