P / Invoke帮助程序集中的CLS兼容类型

时间:2010-09-21 08:38:27

标签: c# .net assemblies marshalling cls-compliant

如果组件必须标记为符合CLS标准,我想知道这两种方式中的哪一种是The Better One™:

具有单独的帮助程序集,其中只包含旧版第三方组件的P / Invoke声明。
  • 在非强制声明Int32公开 P / Invoke声明中使用unsigned int
  • 内部 P / Invoke声明中使用UInt32,其中非托管声明包含unsigned int,并将其包装在公共方法中Int32并在调用内部方法时将其转换为UInt32

这些的优缺点是什么?

2 个答案:

答案 0 :(得分:1)

如果选择1,我认为你没有得到正确的行为.Int32只能高达2,147,483,647。而unsigned int最多可达4,294,967,295。只要你知道你不需要超过20亿的任何价值,它就没关系。但是从技术上来说,公共接口应该公开一个更大的类型并执行边界检查以确保它适合unsigned int并且如果没有则抛出异常。 Int64会做(9,223,372,036,854,775,807)。

答案 1 :(得分:1)

当uint变得太大时,P / Invoke marshaller不会抱怨,你最终会得到一个负数int。额外的层允许您使用 checked 关键字生成OverflowException。这是相当可取的。

是否值得麻烦是次要问题。许多API(如Win32)使用无符号作为逻辑约束。就像字符串的长度或内存块的大小一样,它永远不会是负数。在实践中,这样的数字永远不会溢出。因为不可能分配那么多内存。我不记得在一个API中运行一次,它应该是一个应该使用ung的灌篮。因此,我认为你只需使用带有整数的直接pinvoke声明即可。