根据MSDN(http://msdn.microsoft.com/zh-cn/library/75dwhxf7%28v=vs.80%29.aspx),blittable是:这里的关键就是“不需要特殊处理”,即托管内存中的数据,可以直接让非托管方使用(反之亦然)。
Interop在进行封送时候,对bittable可以不进行拷贝,而是直接内存锚定(见上一行)。
因此是否可以直接内存锚定可以用来判断是否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
}
Interop在进行封送时候,对bittable可以不进行拷贝,而是直接内存锚定(见上一行)。
因此是否可以直接内存锚定可以用来判断是否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
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货