Blittable 类型

Blittable 类型是托管代码和本机代码中具有相同位级别表示形式的类型。 因此,无需将这些类型转换为其他格式即可往返本机代码进行封送,而且由于这样可以提高性能,应首选这些类型:
1、byte, sbyte, short, ushort, int, uint, long, ulong, single, double
2、Blittable 类型的非嵌套一维数组(例如,int[])
3、具有实例字段只有 blittable 值类型的固定布局的结构和类
固定的布局需要 [StructLayout(LayoutKind.Sequential)] 或 [StructLayout(LayoutKind.Explicit)]
默认情况下结构为 LayoutKind.Sequential,类为 LayoutKind.Auto
4、不是 blittable: bool
5、有时为 blittable: char,string
如果 char 位于一维数组中, 或者如果它是包含使用 CharSet = CharSet.Unicode 的 [StructLayout] 显式标记的类型的一部分,则该类型为 blittable。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct UnicodeCharStruct
{
    public char c;
}

如果 string 不包含在其他类型中,并且作为使用 [MarshalAs(UnmanagedType.LPWStr)] 标记的参数传递或 [DllImport] 已设置 CharSet = CharSet.Unicode,则该类型为 blittable。

引用:https://docs.microsoft.com/zh-cn/dotnet/standard/native-interop/best-practices#blittable-types

可以直接内存锚定可以用来判断是否blittable:

//这段代码来自网络,我也不知道对不对,暂时留在这里作为参考
static bool IsBlittable(object obj)
{
    try
    {
        GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);  //<--
        handle.Free();
        return true;
    }
    catch { }
    return false;
}
static void Main(string[] args)
{
    bool b1 = IsBlittable((byte)0);    // true
    bool b2 = IsBlittable(true);       // false
    bool b3 = IsBlittable(0);          // true
    bool b4 = IsBlittable((char)0);    // false
    bool b5 = IsBlittable(new int[3]); // true
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容