импорт структуры и метода из c++

152
27 ноября 2018, 05:20

есть такая структура

struct VkExtensionProperties {
    char        extensionName[VK_MAX_EXTENSION_NAME_SIZE];
    uint32_t    specVersion;
}

и метод в котором она используется

VkResult vkEnumerateInstanceExtensionProperties(const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties)

в c# написал так

public unsafe struct VkExtensionProperties
{
    public fixed char extensionName[(int)vk.VK_MAX_EXTENSION_NAME_SIZE];
    public uint specVersion;
}
VkResult vkEnumerateInstanceExtensionProperties([MarshalAs(UnmanagedType.LPWStr)] string pLayerName, ref uint pPropertyCount,[Out] [MarshalAs(UnmanagedType.LPArray)] VkExtensionProperties[] vkExtensionProperties);

но структуры оказываются пустыми. как правильно импортировать структуру и метод?

Answer 1

char в С# означает совсем не то, что в С++. Вместо массива char в данном случае нужно использовать string и ByValTStr.

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct VkExtensionProperties
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=(int)vk.VK_MAX_EXTENSION_NAME_SIZE)]
    public string extensionName;
    public uint specVersion;
}
Answer 2

Можно добавить в структуру оператор

VkExtensionProperties*
operator ()(const char* p,  uint32_t k)
{
    if (p)
        strcpy(extensionName, p);
    specVersion = k;
    return this;
}

а потом можно будет передавать в вашу функцию например так:

const char* name = "pLayerName";
uint32_t  k{5};
VkExtensionProperties v;
vkEnumerateInstanceExtensionProperties(name, &k, v(name, k));

поля обьекта v будут иннициализированы первым и вторым аргументом

READ ALSO
Почему не меняется Effect Distance в Shadow unity3d

Почему не меняется Effect Distance в Shadow unity3d

Навесил метод на кнопку, но при нажатии ничего не происходит, остаются прежние значения, почему?

180
Проверка на отсутствие одинаковых TabPage`ов

Проверка на отсутствие одинаковых TabPage`ов

Мне необходимо проверить все TabPage`ы в TabControl, и если среди них не был найден ни один с определенным текстом, то выполнять на определенное действие

149
Как сделать синхронную анимацию на Unity 3D

Как сделать синхронную анимацию на Unity 3D

Я делаю игру Match3 на unity (C#)Мне нужно синхронизировать анимацию отдельных элементов в Unity (C#), при выделение одно элемента анимация включается...

155