如何将(和Marshall)CityHash std :: pair <uint64,uint64>从C#转换为C ++,反之亦然</uint64,uint64>

时间:2011-07-25 16:30:08

标签: c# c++ casting marshalling

CityHash允许我们生成128位哈希,但是整数的128位表示被定义为一对uint64 s(如header of CityHash.h中所示):

typedef boost::uint64_t uint64;
typedef std::pair<uint64, uint64> uint128;

我有一个.NET包装器,允许我调用64位版本的城市哈希:

public ref class CityHashDotNet
{
public:
    inline static void CityHash64Batch(const char* const value, uint64* const hashes, const int numValues)
    {
        // I have a wrapper for CityHash that allows me to make batch calls (saves on interops)
        CityHashWrapper::CityHash64Batch(value, hashes, numValues);
    }
    //...
}

这允许我通过将值存储器指针强制转换为sbyte*并将散列存储器指针转换为ulong*并调用CityHashDotNet包装函数,轻松地从C#生成散列:

// The MemoryPointer is an IntPtr
CityHashDotNet.CityHash64Batch((sbyte*)values.MemoryPointer, (ulong*)hashes.MemoryPointer, size);

我想围绕128位版本的城市哈希创建一个包装器,但我不知道如何对哈希所需的std::pair进行编组。我定义了一个与std::pair匹配的类,我打算用它来复制std::pair结构:

public class Pair<T1, T2>
{
    public T1 First { get; set; }
    public T2 Second { get; set; }

    public Pair(T1 first, T2 second)
    {
        First = first;
        Second = second;
    }
}

问题在于我无法将IntPtr转换为std::pair<ulong,ulong>*ulonguint64相同)。我尝试将其转换为Pair<ulong,ulong>*,但我收到了构建错误:

// Does not work!
CityHashDotNet.CityHash128Batch((sbyte*)values.MemoryPointer, (Pair<ulong,ulong>*)hashes.MemoryPointer, size);

我得到的错误是:

error CS1503: ... cannot convert from `Pair<ulong,ulong>*` to `std.pair<unsigned __int64,unsigned __int64>*`

如何解决此问题?

1 个答案:

答案 0 :(得分:3)

您不能在指向这些类型的指针之间进行转换,它们没有兼容的布局。您必须在每种类型的数组之间复制数据,一次一个字段。在C ++ / CLI代码中执行此操作,并让C#代码看到漂亮的.NET数组。

相关问题