gpt4 book ai didi

c# - blittable 类型上的非 blittable 错误

转载 作者:可可西里 更新时间:2023-11-01 08:20:59 28 4
gpt4 key购买 nike

我有这个结构和这段代码:

[StructLayout(LayoutKind.Sequential, Pack = 8)]
private class xvid_image_t
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public int[] stride;

// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
// public IntPtr[] plane;
}

public int decore()
{
xvid_image_t myStruct = new xvid_image_t();
myStruct.stride = new int[4]; // can be commented out - same result
GCHandle.Alloc(myStruct, GCHandleType.Pinned);

// ...
}

当我尝试运行它时,我得到一个 ArgumentException 说:

Object contains non-primitive or non-blittable data

看完this MSDN page

The following complex types are also blittable types:

  • One-dimensional arrays of blittable types, such as an array of integers. However, a type that contains a variable array of blittable types is not itself blittable.

  • Formatted value types that contain only blittable types (and classes if they are marshaled as formatted types). For more information about formatted value types, see Default Marshaling for Value Types.

我不明白我做错了什么。我不只是想使用 Marshal,还想了解这一点。

所以我真正想知道的是:

  1. 为什么?
  2. 我该如何解决这个问题?
  3. 您提供的解决方案是否也适用于结构中的注释行?

我正在使用 .Net 4.5,但还需要 .Net 2.0 的解决方案。

最佳答案

Object contains non-primitive or non-blittable data

这就是您收到的异常消息。您正在关注消息的“不可复制”部分,但这不是问题所在。问题在于“非原始”部分。数组是一种非原始数据类型。

CLR 试图让您远离这里的麻烦。您可以固定对象,但仍然有问题,数组不会被固定。当一个对象也有需要固定的字段时,它就不是真正固定的。

UnmanagedType.ByValArray 有一个更大的问题,它需要结构转换。换句话说,您需要的布局与托管类对象的布局完全不同。只有 pinvoke 编码器才能进行此转换。

通过使用固定大小的缓冲区,使用 fixed 关键字,您可以在不使用 pinvoke 编码器的情况下获得所需内容。这需要使用 unsafe 关键字。让它看起来像这样:

    [StructLayout(LayoutKind.Sequential)]
unsafe private struct xvid_image_t {
public fixed int stride[4];
}

请注意,您必须将声明更改为struct 类型。它现在是一个值类型,当您将其设为局部变量时,您不再需要使用 GCHandle 来固定该值。请确保无论非托管代码采用结构值(通常是通过引用),都不会存储指向该结构的指针。那会严重地爆炸并且完全无法诊断。 unsafe 关键字在这里很合适。如果它确实存储了指针,那么您确实必须采取措施并使用 Marshal.AllocHGlobal() 和 Marshal.StructureToPtr() 来确保指针在非托管代码使用它时保持有效。

关于c# - blittable 类型上的非 blittable 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15544818/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com