Какой правильный код взаимодействия C # для обработки этой структуры и метода? - PullRequest
0 голосов
/ 05 декабря 2009

Я пишу управляемую оболочку вокруг неуправляемой библиотеки 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, которые я мог бы использовать, чтобы помочь мне?

Заранее спасибо!

1 Ответ

0 голосов
/ 05 декабря 2009

Попробуйте следующее

    [StructLayoutAttribute(LayoutKind.Sequential)]
    public unsafe struct RdsData_t
    {

        /// WORD->unsigned short
        public ushort PI_code;

        /// DWORD[31]
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 31, ArraySubType = UnmanagedType.U4)]
        public fixed uint grpStat[31];

        /// BYTE->unsigned char
        public byte PTY_code;

        /// char*
        [MarshalAsAttribute(UnmanagedType.LPStr)]
        public string PS;

        /// char*
        [MarshalAsAttribute(UnmanagedType.LPStr)]
        public string RT;
    }

Примечание: однако для того, чтобы это работало, вам нужно разрешить библиотеке / приложению выполнять небезопасный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...