public Result CreateInstance(MgInstanceCreateInfo createInfo, IMgAllocationCallbacks allocator, out IMgInstance instance) { var allocatedItems = new List <IntPtr>(); try { uint enabledLayerCount; var ppEnabledLayerNames = VkInteropsUtility.CopyStringArrays(allocatedItems, createInfo.EnabledLayerNames, out enabledLayerCount); uint enabledExtensionCount; var ppEnabledExtensionNames = VkInteropsUtility.CopyStringArrays(allocatedItems, createInfo.EnabledExtensionNames, out enabledExtensionCount); var pApplicationInfo = IntPtr.Zero; if (createInfo.ApplicationInfo != null) { var acInfo = new VkApplicationInfo { sType = VkStructureType.StructureTypeApplicationInfo, pNext = IntPtr.Zero, apiVersion = createInfo.ApplicationInfo.ApiVersion, applicationVersion = createInfo.ApplicationInfo.ApplicationVersion, engineVersion = createInfo.ApplicationInfo.EngineVersion, pApplicationName = CopySingleString(allocatedItems, createInfo.ApplicationInfo.ApplicationName), pEngineName = CopySingleString(allocatedItems, createInfo.ApplicationInfo.EngineName), }; var destPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VkApplicationInfo))); allocatedItems.Add(destPtr); Marshal.StructureToPtr(acInfo, destPtr, false); pApplicationInfo = destPtr; } var ici = new VkInstanceCreateInfo { sType = VkStructureType.StructureTypeInstanceCreateInfo, pNext = IntPtr.Zero, enabledLayerCount = enabledLayerCount, ppEnabledLayerNames = ppEnabledLayerNames, enabledExtensionCount = enabledExtensionCount, ppEnabledExtensionNames = ppEnabledExtensionNames, pApplicationInfo = pApplicationInfo, }; var bAllocator = allocator as MgVkAllocationCallbacks; IntPtr allocatorPtr = bAllocator != null ? bAllocator.Handle : IntPtr.Zero; IntPtr handle = IntPtr.Zero; var result = Interops.vkCreateInstance(ref ici, allocatorPtr, ref handle); instance = new VkInstance(handle); return((Result)result); } finally { //foreach (var mem in allocatedItems) //{ // Marshal.FreeHGlobal(mem); //} } }