【发布时间】:2016-01-06 04:23:08
【问题描述】:
在 C# 中,我声明了一个接口,它将向 COM 公开以供 C++ 使用。我们的规范说一个整数参数应该是[in]UINT uiVal。我在 C# 中使用int,它被公开为long。
这没什么大不了的,但我怎样才能强制它编组到UINT 而不是long?一些特定的 .Net 类型,还是我需要以某种方式向 C# 参数添加属性?
【问题讨论】:
标签: com com-interop idl
在 C# 中,我声明了一个接口,它将向 COM 公开以供 C++ 使用。我们的规范说一个整数参数应该是[in]UINT uiVal。我在 C# 中使用int,它被公开为long。
这没什么大不了的,但我怎样才能强制它编组到UINT 而不是long?一些特定的 .Net 类型,还是我需要以某种方式向 C# 参数添加属性?
【问题讨论】:
标签: com com-interop idl
UINT 是来自 Windows SDK 的类型别名,您永远无法从类型库中获取它。转换类型库的工具(例如您正在使用的#import 指令)选择本机 C 类型。历史起了作用,COM 最初是为 16 位版本的 Windows 设计的。当 long 对声明 32 位整数很重要时。
在 C# 声明中,您可以获得的最接近的是 uint,它将在您的 C++ 代码中转换为 unsigned long。没关系,它仍然是 32 位类型,微软为 64 位代码选择了LLP64 data model。他们没有太多选择。与 *nix 中选择的 LP64 模型不同。他们也别无选择,Y2K38 灾难正在迅速逼近 :)
【讨论】: