c#等效于c ++ / cli long

时间:2011-08-03 19:07:41

标签: c# types c++-cli

我在C#中声明了一个像这样的方法:

[OperationContract]
[FaultContract(typeof(MyException))]
MyClass MyMethod(... some params ..., Int32[] myParam);

在C ++ / CLI中,需要编写与接口匹配的方法:

MyClass^ MyMethod(... some params ..., array<long>^ myParam) { ...

我需要从.Net转移C ++世界的longs数组。我知道C ++长的不是.Net长。但我不知道如何做到这一点。

3 个答案:

答案 0 :(得分:3)

System::Int32(或简称Int32有什么问题,因为大多数C ++ / CLI源文件都有using namespace System)?

MyClass^ MyMethod(... some params ..., array<Int32>^ myParam) 

通常,在与.NET通信时使用.NET类型。

答案 1 :(得分:0)

在MSVC的C ++编译器中,longint具有相同的大小。我不确定你是否在考虑long long代表MSVC中的64位有符号整数。如果你的意思是long,那么.Net中的Int32应该没问题。

为了确保安全,您可以将提供的宏用于带符号的32位整数:

#include <cstdint>

MyClass^ MyMethod(... params ..., array<int32_t>^ myParam) { ...

或者更好的是,使用.NET定义的类型作为Alexandre C建议:

MyClass^ MyMethod(... params ..., array<System::Int32>^ myParam) { ...

需要注意的最重要的事情是,intlongint32_tSystem::Int32在当前MSVC中的大小完全相同C ++编译器。使用哪个并不重要,但int32_tSystem::Int32是最安全的选择。

Microsoft可以在以后将其long更改为更大的32位大小。如果发生这种情况,那么您可以使用新编译器重新编译相同的代码,并且没有问题。

关于每种数据类型的大小,标准要求intlong至少大4个字节。在某些编译器上,您可能会发现sizeof(long) != sizeof(int)。因此,如果要确保使用的字符串大小恰好为4个字节,则应使用提供的标头来保证所需的大小。

有关详细信息,请参阅此处:http://en.wikipedia.org/wiki/Long_integer。该文章包括标准的相关链接。

答案 2 :(得分:0)

C ++中的

longint具有相同的大小(4个字节),并且都映射到.NET类型System.Int32。但是,long在用作参数或字段时,具有可选修饰符System.Runtime.CompilerServices.IsLong(在CIL中,它是int32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong)

这允许您创建仅在int / long参数中不同的方法重载。