MarshalDirectiveException - PullRequest
       2

MarshalDirectiveException

0 голосов
/ 20 декабря 2011

Я хотел бы использовать неуправляемый код из C в C #.

Я построил DLL с кодом C с помощью этих функций:

struct GetPluginData
{
 int data[22];
};

DLLEXPORT extern "C" __declspec (dllexport) GetPluginData GetDataArray(int number);

В C # у меня есть этот код:

[StructLayoutAttribute(LayoutKind.Sequential, Pack=1)]
        public unsafe struct GetPluginData
        {
            /// int[22]
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 22, ArraySubType = UnmanagedType.I4)]
            public int[] data;
        }

[DllImport("RBRPlugin.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "GetDataArray")]
        [return: MarshalAs(UnmanagedType.Struct)]
        public static extern GetPluginData GetDataArray(int number);

В событии кнопки или в другом местекод, я написал это:

GetPluginData tes = GetDataArray(1);

И я получаю ошибку: Сигнатура типа этого метода не совместима с PInvoke.

Я ищу информацию через Google, ноничего не найдено ...

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

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Проблемы:

  • CallingConvertion.StdCall неверен, вы не объявили функцию __stdcall в коде C. Сделай это CallingConvention.Cdecl.
  • Удалите атрибут [return: MarshalAs (UnmanagedType.Struct)], это неверно. UnmanagedType.Struct довольно неинтуитивен и фактически не используется в структурах.
  • Удалите свойство атрибута Pack, оно вряд ли будет правильным, хотя здесь безвредным. Упаковка по умолчанию в компиляторе C - 8, если вы не использовали #pragma pack или параметр компиляции / Zp.
  • Маршаллер pinvoke не поддерживает возврат структуры в виде возвращаемого значения функции, содержащей встроенный массив. Источник исключения. Объявите его как fixed int data[22].
0 голосов
/ 21 декабря 2011

Здесь лучше, правильный код:

[DllImport("RBRPlugin.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetDataArray")]
public static extern GetPluginData GetDataArray(int number);

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct GetPluginData
{
    public unsafe fixed int data[22];
}

public GetPluginData temp1 = new GetPluginData();

private void button1_Click(object sender, EventArgs e)
{
    GetPluginData test = GetDataArray(1);
    temp1 = test;
    unsafe
    {
        fixed (GetPluginData* p = &temp1)
        {
            p->data[0] = 1;
        }
    }
}
...