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

时间:2016-08-28 12:28:48

标签: c++-cli mixed-mode

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

CalcBuffer(unsigned long long* bufferSize);

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

CalcBufferWrapper([Out] UInt64^% bufferSize){
     CalcBuffer(bufferSize);
}

但是我收到了这个错误:

  

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

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

1 个答案:

答案 0 :(得分:5)

System.cmd("gs", ["-q", "-dNODISPLAY", "-c \"(/Users/developer/Desktop/1449367569_Concurrency.pdf) (r) file runpdfbegin pdfpagecount = quit\""]) 并不代表您的想法。 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;
}

这也应该是属性的一些可能性。