什么 .NET 类型编组到 COM UINT?

What .NET type marshalls to COM UINT?

在 C# 中,我声明了一个接口,它将暴露给 COM 以供 C++ 使用。我们的规范规定一个整数参数应该是 [in]UINT uiVal。我在 C# 中使用 int,它被公开为 long

这没什么大不了的,但是我怎样才能强制它编组为 UINT 而不是 long?某些特定的 .Net 类型,或者我是否需要以某种方式向 C# 参数添加属性?

UINT 是 Windows SDK 的类型别名,您永远无法从类型库中获取它。转换类型库的工具,例如您正在使用的 #import 指令,选择原生 C 类型。历史起了作用,COM 最初是为 Windows 的 16 位版本设计的。当 long 声明一个 32 位整数很重要时。

您可以获得的最接近的是 C# 声明中的 uint,它将在您的 C++ 代码中转换为 unsigned long。没关系,它仍然是 32 位类型,微软为 64 位代码选择了 LLP64 data model。他们没有太多选择。与 *nix 中选择的 LP64 模型不同。他们也没有多少选择,Y2K38灾难来得很快:)