Blittable 類型是托管代碼和本機(jī)代碼中具有相同位級(jí)別表示形式的類型。 因此,無需將這些類型轉(zhuǎn)換為其他格式即可往返本機(jī)代碼進(jìn)行封送,而且由于這樣可以提高性能,應(yīng)首選這些類型:
1、byte, sbyte, short, ushort, int, uint, long, ulong, single, double
2、Blittable 類型的非嵌套一維數(shù)組(例如,int[])
3、具有實(shí)例字段只有 blittable 值類型的固定布局的結(jié)構(gòu)和類
固定的布局需要 [StructLayout(LayoutKind.Sequential)] 或 [StructLayout(LayoutKind.Explicit)]
默認(rèn)情況下結(jié)構(gòu)為 LayoutKind.Sequential,類為 LayoutKind.Auto
4、不是 blittable: bool
5、有時(shí)為 blittable: char,string
如果 char 位于一維數(shù)組中, 或者如果它是包含使用 CharSet = CharSet.Unicode 的 [StructLayout] 顯式標(biāo)記的類型的一部分,則該類型為 blittable。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct UnicodeCharStruct
{
public char c;
}
如果 string 不包含在其他類型中,并且作為使用 [MarshalAs(UnmanagedType.LPWStr)] 標(biāo)記的參數(shù)傳遞或 [DllImport] 已設(shè)置 CharSet = CharSet.Unicode,則該類型為 blittable。
引用:https://docs.microsoft.com/zh-cn/dotnet/standard/native-interop/best-practices#blittable-types
可以直接內(nèi)存錨定可以用來判斷是否blittable:
//這段代碼來自網(wǎng)絡(luò),我也不知道對(duì)不對(duì),暫時(shí)留在這里作為參考
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
}