Blittable 類型是托管代碼和本機代碼中具有相同位級別表示形式的類型。 因此甫匹,無需將這些類型轉(zhuǎn)換為其他格式即可往返本機代碼進行封送绒怨,而且由于這樣可以提高性能第队,應(yīng)首選這些類型:
1、byte, sbyte, short, ushort, int, uint, long, ulong, single, double
2纷闺、Blittable 類型的非嵌套一維數(shù)組(例如算凿,int[])
3、具有實例字段只有 blittable 值類型的固定布局的結(jié)構(gòu)和類
固定的布局需要 [StructLayout(LayoutKind.Sequential)] 或 [StructLayout(LayoutKind.Explicit)]
默認情況下結(jié)構(gòu)為 LayoutKind.Sequential犁功,類為 LayoutKind.Auto
4氓轰、不是 blittable: bool
5、有時為 blittable: char浸卦,string
如果 char 位于一維數(shù)組中署鸡, 或者如果它是包含使用 CharSet = CharSet.Unicode 的 [StructLayout] 顯式標記的類型的一部分,則該類型為 blittable限嫌。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct UnicodeCharStruct
{
public char c;
}
如果 string 不包含在其他類型中靴庆,并且作為使用 [MarshalAs(UnmanagedType.LPWStr)] 標記的參數(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ò)撒穷,我也不知道對不對,暫時留在這里作為參考
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
}