日期:2014-05-17  浏览次数:20864 次

有没有什么函数调用能判断一个C#的类型是不是blittable的?
C++的type_traits里面有功能可以判断一个类型是不是POD(纯数据类型)
C#里面有没有什么方法能判断一个类型是不是blittable类型呢?

谢谢!
------解决方案--------------------
根据MSDN(http://msdn.microsoft.com/zh-cn/library/75dwhxf7%28v=vs.80%29.aspx),blittable是:
MSDN
...在托管和非托管内存中都有公共的表示形式,而不需要 Interop 封送拆收器的特殊处理...


这里的关键就是“不需要特殊处理”,即托管内存中的数据,可以直接让非托管方使用(反之亦然)。
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
}