【问题标题】:Code Analysis CA1060 Fix代码分析 CA1060 修复
【发布时间】:2011-10-20 14:25:33
【问题描述】:

我的应用程序中有以下代码:

[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hwnd, int index);

[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,
               int x, int y, int width, int height, uint flags);

[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hwnd, uint msg,
               IntPtr wParam, IntPtr lParam);

我从代码分析 (FxCop) 收到以下警告:

CA1060 : Microsoft.Design : 因为它是一个 P/Invoke 方法, 'IconHelper.GetWindowLong(IntPtr, int)' 应该在一个类中定义 命名为 NativeMethods、SafeNativeMethods 或 UnsafeNativeMethods。

谁能告诉我应该把他们放在哪个班级?不知道是 Native、SafeNative 还是 UnsafeNative。

【问题讨论】:

标签: c# code-analysis fxcop


【解决方案1】:

您可以在此处获得有关此警告的详细信息:http://msdn.microsoft.com/en-us/library/ms182161.aspx。简而言之:

对于大多数应用程序,将 P/Invokes 移至名为 NativeMethods 的新类就足够了。

【讨论】:

    【解决方案2】:

    尝试将它们全部移到 NativeMethod 类中,它会解决问题

    修复后你的代码应该是这样的

    public class NativeMethods {
    [DllImport("user32.dll")]
    private static extern int GetWindowLong(IntPtr hwnd, int index);
    
    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);
    
    [DllImport("user32.dll")]
    private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,
                   int x, int y, int width, int height, uint flags);
    
    [DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hwnd, uint msg,
                   IntPtr wParam, IntPtr lParam);
    }
    

    记得更改所有调用这些方法的地方

    改变之前

    SendMessage(IntPtr hwnd, uint msg,IntPtr wParam, IntPtr lParam)
    

    应该是

    NativeMethods.SendMessage(IntPtr hwnd, uint msg,IntPtr wParam, IntPtr lParam)
    

    【讨论】:

    • 方法不应该公开吗?
    • 在上面的代码方法应该是“内部的”。 “公共”引发警告“CA1401 P/Invokes 不应可见”
    • 使它成为一个静态类也很聪明(您只是将方法放在该类中,而不是在其中保存任何状态)。所以你的类声明就像internal static class NativeMethods { ...
    【解决方案3】:

    你可以通过定义来抑制这个警告

    <PropertyGroup> 
    ..... 
         <NoWarn>CA1060</NoWarn>
    ..... 
    </PropertyGroup>
    

    在配置文件(.csproj 文件)中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-27
      • 2015-02-21
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多