C++\CLI - 如何将UInt64 ^%转换为无符号长long*

Ita*_*Gal 4 mixed-mode c++-cli

我有一个C++函数来计算缓冲区大小:

CalcBuffer(unsigned long long* bufferSize);
Run Code Online (Sandbox Code Playgroud)

我希望稍后在我的C#代码中将此结果传递给另一个函数.我的C++\CLI Wrapper看起来像这样:

CalcBufferWrapper([Out] UInt64^% bufferSize){
     CalcBuffer(bufferSize);
}
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

"System :: UInt64 ^"类型的参数与"unsigned long long*"类型的参数不兼容.

显然,我需要使用不同的类型,但是哪种类型?

Han*_*ant 5

UInt64^%并不意味着你的想法.该^帽子应仅用于引用类型,UInt64是值类型.99%的情况下这样做是错误的,但C++/CLI编译器无论如何都接受它并将其解释为"对盒装 64位无符号整数的引用".装箱转换将值转换为对象,实现了值类型也派生自System :: Object的着名错觉.

这肯定与unsigned long long*不兼容.请检查您的代码,以确保您不会在其他地方不小心使用^ hat.这是一个激烈的处理器周期接收器,使代码比它需要的速度慢一个数量级.

你必须停止使用帽子.并且处理添加它的可能原因,UInt64 可能是托管对象的字段.这可能由垃圾收集本地代码运行时移动.这将是完全灾难性的(本机代码现在破坏了堆),因此编译器不会允许它.您必须提供无法移动的值的稳定副本:

void CalcBufferWrapper(UInt64% bufferSize) {
     auto size = bufferSize;      // Values on the stack don't move
     CalcBuffer(&size);
     bufferSize = size;
}
Run Code Online (Sandbox Code Playgroud)

或者好,根本不需要给包装完全相同的签名被包装的函数:

UInt64 CalcBufferWrapper() {
   unsigned long long size;
   CalcBuffer(&size);
   return size;
}
Run Code Online (Sandbox Code Playgroud)

一些可能性,这应该是一个属性.