【问题标题】:.NET Framework: Argument type 'uint' is not CLS-compliant on P/Invoke.NET Framework:参数类型“uint”在 P/Invoke 上不符合 CLS
【发布时间】:2009-11-25 15:22:07
【问题描述】:

忽略此警告是否安全?

参数类型“uint”不符合 CLS

我正在开发一个 Compact Framework 应用程序,我有很多 P/Invoke,我必须使用 uint、ushort 等作为参数类型。

我使用[CLSCompliantAttribute(false)] 来避免警告消息,但我不知道它是否安全。

我们将不胜感激。

谢谢。

【问题讨论】:

    标签: c# .net compact-framework pinvoke


    【解决方案1】:

    如果您编写的组件不是供其他人使用的其他语言,那么您不需要符合 CLS。只要声明你不是(就像你已经做过的那样)。

    但是,可以在内部使用 uint 并且仍然提供符合 CLS 的接口。 Writing CLS-Compliant Code.

    (链接已更新)

    【讨论】:

    【解决方案2】:

    您可以安全地将符合 CLS 的有符号类型替换为其相同大小的不符合 CLS 的无符号类型。

    以下内容实际上是相同的(我在 pinvoke.net 上找到的第一个 User32 函数):

    [DllImport("user32.dll")]
    static extern int ActivateKeyboardLayout(IntPtr nkl, uint Flags);
    
    [DllImport("user32.dll")]
    static extern int ActivateKeyboardLayout(IntPtr nkl, int Flags);
    

    有符号和无符号位域的行为相同。您唯一可能遇到问题的地方是您是否需要传递或接收真正巨大的数字,这些数字将映射为负数(查找 2 的补码)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多