1

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

今回のエラーは、固定サイズの配列が原因です。何か案が ?

ご協力ありがとうございました。

4

0 に答える 0