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*"类型的参数不兼容.
显然,我需要使用不同的类型,但是哪种类型?
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)
一些可能性,这应该是一个属性.