我在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长。但我不知道如何做到这一点。
答案 0 :(得分:3)
System::Int32
(或简称Int32
有什么问题,因为大多数C ++ / CLI源文件都有using namespace System
)?
MyClass^ MyMethod(... some params ..., array<Int32>^ myParam)
通常,在与.NET通信时使用.NET类型。
答案 1 :(得分:0)
在MSVC的C ++编译器中,long
和int
具有相同的大小。我不确定你是否在考虑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) { ...
需要注意的最重要的事情是,int
,long
,int32_t
和System::Int32
在当前MSVC中的大小完全相同C ++编译器。使用哪个并不重要,但int32_t
和System::Int32
是最安全的选择。
Microsoft可以在以后将其long
更改为更大的32位大小。如果发生这种情况,那么您可以使用新编译器重新编译相同的代码,并且没有问题。
关于每种数据类型的大小,标准要求int
和long
至少大4个字节。在某些编译器上,您可能会发现sizeof(long) != sizeof(int)
。因此,如果要确保使用的字符串大小恰好为4个字节,则应使用提供的标头来保证所需的大小。
有关详细信息,请参阅此处:http://en.wikipedia.org/wiki/Long_integer。该文章包括标准的相关链接。
答案 2 :(得分:0)
long
和int
具有相同的大小(4个字节),并且都映射到.NET类型System.Int32。但是,long
在用作参数或字段时,具有可选修饰符System.Runtime.CompilerServices.IsLong
(在CIL中,它是int32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong)
)
这允许您创建仅在int
/ long
参数中不同的方法重载。