C # DllImport : vkCreateInstance 호출시 AccessViolationException

Clematrics

C #에서 Vulkan 래퍼를 만들려고하는데 함수를 호출 할 때 몇 가지 문제가 있습니다. vulkan.h 헤더를 다음과 같이 다시 작성했습니다.

public static class Vk {
    [StructLayout(LayoutKind.Sequential)] public class Instance { }

    public enum Result {
        ...
    }
    public enum StructureType {
        ...
    }

    [StructLayout(LayoutKind.Sequential)] public class ApplicationInfo {
        public StructureType sType;
        public IntPtr pNext;
        public string pApplicationName;
        public uint applicationVersion;
        public string pEngineName;
        public uint engineVersion;
        public uint apiVersion;
    }

    [StructLayout(LayoutKind.Sequential)] public class InstanceCreateInfo {
        public StructureType sType;
        public IntPtr pNext;
        public uint flags_VkInstanceCreateFlags;
        public ApplicationInfo pApplicationInfo;
        public uint enabledLayerCount;
        public string[] ppEnabledLayerNames;
        public uint enabledExtensionCount;
        public string[] ppEnabledExtensionNames;
    }

    [DllImport("vulkan-1.dll", EntryPoint = "vkCreateInstance")]
    public extern static Result CreateInstance(
        InstanceCreateInfo pCreateInfo,
        IntPtr AllocationCallbacks_pAllocator,
        out IntPtr pInstance_Instance);
}

이 함수의 C에서 원래 선언은 다음과 같습니다.

VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
    const VkInstanceCreateInfo*                 pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkInstance*                                 pInstance);

이제 함수를 호출 할 때 다음과 같이합니다.

Vk.InstanceCreateInfo instance_create_info = new Vk.InstanceCreateInfo();
...

IntPtr hinstance;
Vk.Result result = Vk.CreateInstance(instance_create_info, IntPtr.Zero, out hinstance);   <-- error AccessViolationException

유효한 해결책 인 것 같아서 내 문제가 어디에 있는지 이해하지 못합니다 .StackOverflow : c #에서 pInvoke를 통해 vkEnumeratePhysicalDevices를 호출 할 때 AccessViolationException .

IntPtr 힌 스턴스초기화하여 시도했습니다.

Marshal.AllocHGlobal(Marshal.SizeOf<Vk.Instance>());  

또한 Marshal.StructureToPtr (...);을 사용 하여 instance_create_info를 다른 IntPtr로 "변환"하려고했습니다 . 그리고 ref 키워드로 instance_create_infoinstance 를 전달하려고했습니다 . 분명히 아무것도 효과가 없었습니다.

어떤 생각?


편집하다 :

기본 함수는 다음과 같이 사용됩니다.

//Definition
typedef struct VkApplicationInfo {
    VkStructureType    sType;
    const void*        pNext;
    const char*        pApplicationName;
    uint32_t           applicationVersion;
    const char*        pEngineName;
    uint32_t           engineVersion;
    uint32_t           apiVersion;
} VkApplicationInfo;`
typedef struct VkInstanceCreateInfo {
    VkStructureType             sType;
    const void*                 pNext;
    VkInstanceCreateFlags       flags;
    const VkApplicationInfo*    pApplicationInfo;
    uint32_t                    enabledLayerCount;
    const char* const*          ppEnabledLayerNames;
    uint32_t                    enabledExtensionCount;
    const char* const*          ppEnabledExtensionNames;
} VkInstanceCreateInfo;

#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
VK_DEFINE_HANDLE(VkInstance)

//Code
VkApplicationInfo application_info{};
    application_info.sType                  = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    application_info.apiVersion             = VK_API_VERSION;
    application_info.applicationVersion     = VK_MAKE_VERSION( 1, 0, 0 );
    application_info.pApplicationName       = "";
    application_info.engineVersion          = VK_MAKE_VERSION( 1, 0, 0 );
    application_info.pEngineName            = "";

VkInstanceCreateInfo instance_create_info{};
    instance_create_info.sType                      = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    instance_create_info.pApplicationInfo           = &application_info;
    instance_create_info.enabledLayerCount          = 0
    instance_create_info.ppEnabledLayerNames        = nullptr
    instance_create_info.enabledExtensionCount      = 0
    instance_create_info.ppEnabledExtensionNames    = nullptr

VkInstance _instance = nullptr;
assert( !vkCreateInstance( &instance_create_info, nullptr, &_instance ) );
니콜라이 아르 세 노프

이 사람이 C #에 대한 래퍼를 만든 것과 비슷한 작업을 시도하고있는 것 같습니다 . 당신에게 유용 할 수 있습니다. Source / SharpVulkan / Generated / Functions로 이동합니다.

    public static unsafe Instance CreateInstance(ref InstanceCreateInfo createInfo, AllocationCallbacks* allocator = null)
    {
        Instance instance;
        fixed (InstanceCreateInfo* __createInfo__ = &createInfo)
        {
            vkCreateInstance(__createInfo__, allocator, &instance).CheckError();
        }
        return instance;
    }

    [DllImport("vulkan-1.dll", CallingConvention = CallingConvention.StdCall)]
    internal static extern unsafe Result vkCreateInstance(InstanceCreateInfo* createInfo, AllocationCallbacks* allocator, Instance* instance);

    internal static unsafe void EnumerateInstanceExtensionProperties(byte* layerName, ref uint propertyCount, ExtensionProperties* properties)
    {
        fixed (uint* __propertyCount__ = &propertyCount)
        {
            vkEnumerateInstanceExtensionProperties(layerName, __propertyCount__, properties).CheckError();
        }
    }

도움이 되길 바랍니다 :)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Delphi DLL을 C #으로 가져 오기-System.AccessViolationException DllImport

분류에서Dev

C # Steamworks GetSteamID AccessViolationException

분류에서Dev

c# dllimport with pointers

분류에서Dev

DLLImport 호출시 IIS 7.5 오류

분류에서Dev

PInvoke로 래핑 된 C ++ 라이브러리의 병렬 호출은 System.AccessViolationException을 발생시킵니다.

분류에서Dev

DllImport C Sharp const char *

분류에서Dev

Xsl 변환시 AccessViolationException

분류에서Dev

c # autocad dllimport by autocad 버전

분류에서Dev

C ++에서 C DLL을 호출하면 액세스 위반이 발생하지만 DllImport가 작동하는 C # 프로젝트

분류에서Dev

C # 다중 스레드 형식의 AccessViolationException

분류에서Dev

C ++ :: Boost :: 이유없는 AccessViolationException (VS13)

분류에서Dev

C # DLLImport와 함께 MediaInfo DLL 사용

분류에서Dev

C # / C ++ DLLImport를 닫거나 적어도 힙 메모리 할당을 취소 하시겠습니까?

분류에서Dev

C 시스템 호출 open ()

분류에서Dev

표시 함수 호출시 C ++ LinkedList

분류에서Dev

C # 프로그램의 Win32 DLL AccessViolationException

분류에서Dev

Best way to use DllImport in C# and How to get control back from external method

분류에서Dev

Should I release a memory for parameters in C# dllimport native method call?

분류에서Dev

dllimport에서받은 void 포인터 사용 [MSVS C ++ 2010]

분류에서Dev

RISC-V 시스템 호출에 대한 C ++ 함수 호출

분류에서Dev

JNI에서 C 시스템 호출 호출

분류에서Dev

C 시스템 호출 실패

분류에서Dev

C ++에서 popen 대 시스템 호출

분류에서Dev

메서드 호출시 JNI C ++ UnsatisfiedLinkError

분류에서Dev

메서드 호출시 JNI C ++ UnsatisfiedLinkError

분류에서Dev

C # 스택 푸시 호출 문제

분류에서Dev

C에서 시스템 함수 호출

분류에서Dev

MDI 자식 양식을 표시하려고 할 때 AccessViolationException 발생

분류에서Dev

텍스처로드시 OpenTK.dll에서 'System.AccessViolationException'발생

Related 관련 기사

  1. 1

    Delphi DLL을 C #으로 가져 오기-System.AccessViolationException DllImport

  2. 2

    C # Steamworks GetSteamID AccessViolationException

  3. 3

    c# dllimport with pointers

  4. 4

    DLLImport 호출시 IIS 7.5 오류

  5. 5

    PInvoke로 래핑 된 C ++ 라이브러리의 병렬 호출은 System.AccessViolationException을 발생시킵니다.

  6. 6

    DllImport C Sharp const char *

  7. 7

    Xsl 변환시 AccessViolationException

  8. 8

    c # autocad dllimport by autocad 버전

  9. 9

    C ++에서 C DLL을 호출하면 액세스 위반이 발생하지만 DllImport가 작동하는 C # 프로젝트

  10. 10

    C # 다중 스레드 형식의 AccessViolationException

  11. 11

    C ++ :: Boost :: 이유없는 AccessViolationException (VS13)

  12. 12

    C # DLLImport와 함께 MediaInfo DLL 사용

  13. 13

    C # / C ++ DLLImport를 닫거나 적어도 힙 메모리 할당을 취소 하시겠습니까?

  14. 14

    C 시스템 호출 open ()

  15. 15

    표시 함수 호출시 C ++ LinkedList

  16. 16

    C # 프로그램의 Win32 DLL AccessViolationException

  17. 17

    Best way to use DllImport in C# and How to get control back from external method

  18. 18

    Should I release a memory for parameters in C# dllimport native method call?

  19. 19

    dllimport에서받은 void 포인터 사용 [MSVS C ++ 2010]

  20. 20

    RISC-V 시스템 호출에 대한 C ++ 함수 호출

  21. 21

    JNI에서 C 시스템 호출 호출

  22. 22

    C 시스템 호출 실패

  23. 23

    C ++에서 popen 대 시스템 호출

  24. 24

    메서드 호출시 JNI C ++ UnsatisfiedLinkError

  25. 25

    메서드 호출시 JNI C ++ UnsatisfiedLinkError

  26. 26

    C # 스택 푸시 호출 문제

  27. 27

    C에서 시스템 함수 호출

  28. 28

    MDI 자식 양식을 표시하려고 할 때 AccessViolationException 발생

  29. 29

    텍스처로드시 OpenTK.dll에서 'System.AccessViolationException'발생

뜨겁다태그

보관