Я пишу управляемую оболочку вокруг неуправляемой библиотеки DLL и не могу правильно выполнить приведенный ниже метод и структуру. Вот что находится в файле .h для неуправляемого кода:
typedef struct {
WORD PI_code;
DWORD grpStat[31];
BYTE PTY_code;
char* PS;
char* RT;
} RdsData_t;
COMPANYNAME_API void COMPANY_get_rds_data(RdsData_t* rds_data);
и вот что я придумала с помощью PInvoke Interop Assistant:
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RdsData_t
{
/// WORD->unsigned short
public ushort PI_code;
/// DWORD[31]
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 31, ArraySubType = UnmanagedType.U4)]
public uint[] grpStat;
/// BYTE->unsigned char
public byte PTY_code;
/// char*
[MarshalAsAttribute(UnmanagedType.LPStr)]
public string PS;
/// char*
[MarshalAsAttribute(UnmanagedType.LPStr)]
public string RT;
}
[DllImport("companyname.dll", EntryPoint = "?COMPANYNAME_get_rds_data@@YAXPAURdsData_t@@@Z")]
private static extern void COMPANYNAME_get_rds_data(ref RdsData_t data);
Однако, как есть, это вызывает исключение AccessViolationException при вызове. Посредством поиска и экспериментов я могу придумать что-то, что не выдает исключение, но тогда данные неверны или отсутствуют, что наводит меня на мысль, что они также не верны.
Какой код взаимодействия я должен использовать для вышеуказанной структуры? Есть ли какие-либо инструменты, кроме PInvoke Assistant, которые я мог бы использовать, чтобы помочь мне?
Заранее спасибо!