首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类的C#变量在P/Invoke调用后被归零

类的C#变量在P/Invoke调用后被归零
EN

Stack Overflow用户
提问于 2022-05-06 23:02:46
回答 1查看 76关注 0票数 -2

我正在写一些vulkan代码,遇到了一个我无法理解的问题。我有以下代码:

NativeMethods.cs:

代码语言:javascript
复制
[DllImport("libvulkan.1.dylib", EntryPoint = "vkGetPhysicalDeviceProperties", CallingConvention = CallingConvention.Cdecl)]
    public static extern void vkGetPhysicalDeviceProperties(IntPtr vkPhysicalDevice, VkPhysicalDeviceProperties* properties);

GraphicsAdapter.cs:

代码语言:javascript
复制
    internal GraphicsAdapter(
        IntPtr deviceHandle,
        IntPtr surfaceHandle)
    {
        VkPhysicalDeviceProperties properties;
        NativeMethods.vkGetPhysicalDeviceProperties(deviceHandle, &properties);
        ...
    }

我遇到的问题是,在P/Invoke调用之后,变量deviceHandle & surfaceHandle被重置为0x0。另外,如果我在调用后声明一个带有一些值的列表,它的空值。

我在MacBook Air dotnet 6& MoltenVK上运行这个程序。有人能解释一下为什么会发生这种事吗?

编辑1:多亏了我的评论,我发现了这个问题。这确实是我所称的胡子平衡,因为通过的结构有一个不同于vulkan预期的内存布局。

Vulkan使用VkBool32来表示布尔值,即uint32。我想,因为一个普通的bool也是4个字节,所以我可以直接使用它。结果却不知何故..。当将其更改为VkBool32结构(它只有一个uint32值)时,它将按预期的方式再次工作!

编辑2: C#中的bool是1字节,而不是4字节(正如我所怀疑的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-07 17:08:47

多亏了我的评论,我发现了这个问题。这确实是我所称的胡子平衡,因为通过的结构有一个不同于vulkan预期的内存布局。

Vulkan使用VkBool32来表示布尔值,即uint32。我想,因为一个普通的bool也是4个字节,所以我可以直接使用它。结果却不知何故..。(它在CLR上的1字节)当将其更改为VkBool32结构(它只有一个uint32值)时,它将按预期的方式再次工作!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72148175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档