C# プログラムで新しい vulkan API を使用しようとしています。ヘッダー ファイルにしかアクセスできないため、コードをコピーし、安全でないクラスに適用してラップしました。
unsafe public static class Vk {
...
public delegate void* PFN_vkAllocationFunction(...);
public delegate void* PFN_vkReallocationFunction(...);
public delegate void PFN_vkFreeFunction(...);
public delegate void PFN_vkInternalAllocationNotification(...);
public delegate void PFN_vkInternalFreeNotification(...);
public struct AllocationCallbacks {
void* pUserData;
PFN_vkAllocationFunction pfnAllocation;
PFN_vkReallocationFunction pfnReallocation;
PFN_vkFreeFunction pfnFree;
PFN_vkInternalAllocationNotification pfnInternalAllocation;
PFN_vkInternalFreeNotification pfnInternalFree;
}
...
}
すべての PFN_xxx は、もともとヘッダー内の関数ポインターであり、直感的にデリゲートとして書き直しました。だから、今のところ、それは働いています。ただし、コードの後半に、dll からインポートされた次の関数があり、エラーが発生します。
[DllImport("Dll\vulkan-1.dll", EntryPoint = "VkCreateInstance")]
public extern static Result CreateInstance(
InstanceCreateInfo* pCreateInfo,
AllocationCallbacks* pAllocator, <- error here
Instance* pInstance);
エラーはCS0208 で、次のメッセージで説明されています。その中にデリゲートがあるため、管理されています。では、どうすればこの問題を解決できますか? ネット上で満足のいく答えが見つかりませんでした.構造体でデリゲートをアンマネージ関数ポインターとしてマーシャリングしようとしましたが(このように)、うまくいかないようで、コンパイラーはエラーを保持します.
public struct AllocationCallbacks {
void* pUserData;
[MarshalAs(UnmanagedType.FunctionPtr)]
PFN_vkAllocationFunction pfnAllocation;
[MarshalAs(UnmanagedType.FunctionPtr)]
PFN_vkReallocationFunction pfnReallocation;
[MarshalAs(UnmanagedType.FunctionPtr)]
PFN_vkFreeFunction pfnFree;
[MarshalAs(UnmanagedType.FunctionPtr)]
PFN_vkInternalAllocationNotification pfnInternalAllocation;
[MarshalAs(UnmanagedType.FunctionPtr)]
PFN_vkInternalFreeNotification pfnInternalFree;
}
ここに別の問題があります。構造体の固定サイズの配列が定義されている構造体があります。元の宣言は次のとおりです。
typedef struct VkPhysicalDeviceMemoryProperties {
uint32_t memoryTypeCount;
VkMemoryType memoryTypes[VK_MAX_MEMORY_TYPES];
uint32_t memoryHeapCount;
VkMemoryHeap memoryHeaps[VK_MAX_MEMORY_HEAPS];
} VkPhysicalDeviceMemoryProperties;
そして、私はこのように翻訳しました:
[StructLayout(LayoutKind.Sequential)]
public struct PhysicalDeviceMemoryProperties {
uint memoryTypeCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_MEMORY_TYPES)]
MemoryType[] memoryTypes;
uint memoryHeapCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_MEMORY_HEAPS)]
MemoryHeap[] memoryHeaps;
}
しかし、繰り返しますが、次の関数 import が原因で、同じ問題、有名な CS0208 エラーがあります。
[DllImport("Dll\vulkan-1.dll", EntryPoint = "VkGetPhysicalDeviceMemoryProperties")]
public extern static void GetPhysicalDeviceMemoryProperties(
PhysicalDevice physicalDevice,
PhysicalDeviceMemoryProperties* pMemoryProperties); <-error here
今回のエラーは、固定サイズの配列が原因です。何か案が ?
ご協力ありがとうございました。