Маршалинг нативный метод, возвращающий структуру - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь упорядочить структуру, которая возвращается моим собственным кодом, но я получаю System.Runtime.InteropServices.MarshalDirectiveException Это не выходной аргумент, который уже отвечал в других сообщениях, это тип возврата.

Код C ++:

typedef struct
{
    bool success;
    ErrorCode error_code;
    char error_path[1025];
} Result;

DLLEXPORT Result GetResult();

ErrorCode - это перечисление,
C # эквивалент:

[StructLayout(LayoutKind.Sequential)]
public struct Result
{
    public byte success;
    public ErrorCode error_code;
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 1025)]
    public char[] error_path;
}

[DllImport("shared", EntryPoint = "GetReult", CallingConvention = CallingConvention.Cdecl)]
public extern static Result GetResult();

Я знаю, что возвратные структуры в C # p / invoke должны быть blitable введите, но я не знаю, смогу ли я сделать мою структуру прозрачной с помощью директив Marshaling или нет.Есть ли способ сделать это или что-то не так с моим кодом?Если нет способа, мне нужно изменить свой API и сделать тип возвращаемого значения в качестве выходного аргумента.

Спасибо.

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете сделать его более прозрачным, используя буфер фиксированного размера:

[StructLayout(LayoutKind.Sequential)]
public unsafe struct Result
{
    public byte success;
    public ErrorCode error_code;
    public fixed sbyte error_path[1025];
}

Обратите внимание, что я использовал sbyte для типа элемента массива.Это 8-битный тип, который соответствует неизменному типу char, который также является 8-битным типом.Вы использовали char в своем C #, который является 16-битным типом.

Вам может потребоваться преобразовать буфер фиксированного размера в строку, но как именно это сделать, зависит от используемой кодировки.Тем не менее, существует множество статей на эту тему (преобразование буфера фиксированного размера в строку), которые можно найти с помощью веб-поиска.

...