Я работаю над проектом, который должен связываться с DLL. Предоставляемый SDK имеет демонстрационный проект на C++, и он возвращает данные из DLL, используя указанную выше структуру typedef, и он работает хорошо, но я должен сделать то же самое, но в C#, и я попытался создать подобную структуру, но когда я вызываю DLL моя структура заполнена в другом порядке.Эквивалент C++ typedef struct to C#
typedef struct tagTrackIRData
{
unsigned short wNPStatus;
unsigned short wPFrameSignature;
unsigned long dwNPIOData;
float fNPRoll;
float fNPPitch;
float fNPYaw;
float fNPX;
float fNPY;
float fNPZ;
float fNPRawX;
float fNPRawY;
float fNPRawZ;
float fNPDeltaX;
float fNPDeltaY;
float fNPDeltaZ;
float fNPSmoothX;
float fNPSmoothY;
float fNPSmoothZ;
} TRACKIRDATA, *LPTRACKIRDATA;
Проблема заключается в том, что я получил в C# Если структура выше, но я не могу назначить его в том же формате структуры в C# (The структура является из библиотеки DLL C++ и моя программа, назвав его в C#). Я попытался использовать этот тип преобразованной структуры в C#, но данные не попадают в правильное имя переменной, вероятно, из-за отсутствия * LPTRACKIRDATA.
struct TRACKIRDATA
{
public ushort wNPStatus;
public ushort wPFrameSignature;
public ulong dwNPIOData;
public float fNPRoll;
public float fNPPitch;
public float fNPYaw;
public float fNPX;
public float fNPY;
public float fNPZ;
public float fNPRawX;
public float fNPRawY;
public float fNPRawZ;
public float fNPDeltaX;
public float fNPDeltaY;
public float fNPDeltaZ;
public float fNPSmoothX;
public float fNPSmoothY;
public float fNPSmoothZ;
}
Я звоню DLL в C# с помощью этого кода:
TRACKIRDATA tid;
NPRESULT gdRes = getData(&tid);
Где GetData() является
private delegate NPRESULT NP_GetData(TRACKIRDATA* data);
getData = (NP_GetData)Marshal.GetDelegateForFunctionPointer(procAddrNP_GetData, typeof(NP_GetData));
Благодаря @Asik вы были правы! Проблема была вызвана неправильным эквивалентом типа dwNPIOData, потому что именованный long на C++ - 32Bits, а в C# - размер 64 бит. Решение заключается в использовании типа UInt32 в C# public uint dwNPIOData;
Вам не нужны структуры typedef в C++. Это откат от C. – juanchopanza
В чем проблема? – SLaks
@juanchopanza Полезно знать, но dll C++ не принадлежит мне, и я просто вызываю метод из DLL в моем приложении C#, поэтому мне приходится обрабатывать ожидаемую структуру. – exomic