2016-12-09 2 views
0

В настоящее время я пытаюсь получить неуправляемую (c) DLL для работы в моем приложении C#. Проблема, с которой я сталкиваюсь, заключается в передаче структуры в неуправляемую функцию.C# Interop - Как передать структуру C#, к которой может обращаться C как массив структур

Я импортировал функцию, как так (с помощью PInvoke Interop Assistant) ...

[System.Runtime.InteropServices.DllImportAttribute("myDll.dll", EntryPoint = "ListDevices")] 
public static extern int ListDevices(ref Device_t devices, ref int DevicesCount); 

структуры Я пытаюсь передать ...

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Ansi)] 
    public struct Device_t 
    { 
     /// int 
     public int Address; 

     /// int 
     public int GearAddress; 

     /// int 
     public int Id; 

     /// char[8] 
     [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 8)] 
     public string Rev; 
    } 

Функция в коде DLL (не имеет значения кода удалены) ...

static int listDevices(Device_t *devices, int *deviceCount) 
{ 
    char *pch; 
    int i; 
    char *token; 
    int paramCount; 
    Device_t device; 

    // code removed // 

    while (token != NULL) 
     { 
      pch = strstr(token, "ENTRY"); 
      if (pch != NULL) 
      { 
       paramCount = sscanf(&token[0], "%*d ..... %d",   
       &device.Address, &device.GearAddress, &device.Rev, 
       &device.Id); 
       if (paramCount == 4) 
       { 
        devices[i].Address = device.Address; 
        devices[i].GearAddress = device.GearAddress; 
        devices[i].Id = device.Id; 
        strcpy(devices[i].Rev, device.Rev); 
        i++; 
       } 
      } 
      token = strtok(NULL, "#"); 
     } 

    // code removed // 
} 

Основной проблемой является то, что код с доступов Varia-х устройств device_t ' как массив, но функция C# принимает только сингулярный Device_t. Я считаю, что наличие строки в структуре делает ее не-blittable, что усложняет ситуацию :(

В идеале я хочу, чтобы иметь возможность объявлять массив Device_t в C#, к которому можно получить доступ c, однако я ' м осведомленные массивы структурированы по-разному в C# по сравнению с с.

+0

Очень простой выход из к сборке C++/CLI к вашему решению. –

ответ

0

Я нашел этот вопрос, это было так, как я сортировочной функцию DLL.

Как и аудиовыход атрибуты нужно указать.

[System.Runtime.InteropServices.DllImportAttribute("myDll.dll", EntryPoint = "ListDevices")] 
public static extern int ListDevices([In, Out] Device_t[] devices, ref int DevicesCount);