如何铸造(和马歇尔)CityHash std::pair<;uint64、uint64>;从C#到C++;反之亦然

如何铸造(和马歇尔)CityHash std::pair<;uint64、uint64>;从C#到C++;反之亦然,c#,c++,casting,marshalling,C#,C++,Casting,Marshalling,CityHash允许我们生成128位散列,但整数的128位表示被定义为一对uint64s(如图所示): 通过将值内存指针转换为sbyte*,将哈希内存指针转换为ulong*,并调用CityHashDotNet包装函数,我可以轻松地从C生成哈希: // The MemoryPointer is an IntPtr CityHashDotNet.CityHash64Batch((sbyte*)values.MemoryPointer, (ulong*)hashes.MemoryPointer, si

CityHash允许我们生成128位散列,但整数的128位表示被定义为一对
uint64
s(如图所示):

通过将值内存指针转换为
sbyte*
,将哈希内存指针转换为
ulong*
,并调用
CityHashDotNet
包装函数,我可以轻松地从C生成哈希:

// The MemoryPointer is an IntPtr
CityHashDotNet.CityHash64Batch((sbyte*)values.MemoryPointer, (ulong*)hashes.MemoryPointer, size);
我想围绕city哈希的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;
    }
}
我得到的错误是:

error CS1503: ... cannot convert from `Pair<ulong,ulong>*` to `std.pair<unsigned __int64,unsigned __int64>*`
错误CS1503:。。。无法从'Pair*'转换为'std.Pair'*`

如何解决这个问题?

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

试图“保存P/Cukes”是没有意义的,你不使用P/Unjk,而是C++互操作。我以为他们是一样的。我会更正我的帖子。我担心我不得不这么做…:(@Lirik:我可以推荐一个平面数组
uint64
array^
)?您可以锁定它一次,将指针传递到本机代码。然后您的批处理包装器可以在循环中进行两次配对和调用。
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;
    }
}
// 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>*`