В настоящее время я пытаюсь получить неуправляемую (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# по сравнению с с.
Очень простой выход из к сборке C++/CLI к вашему решению. –