【发布时间】:2019-01-28 09:36:26
【问题描述】:
我在wpf 应用程序中使用了一些DllImports 来捕获屏幕。我在user32.dll 中打电话给GetWindowRect。它需要传递给它的 rect 结构。结构的布局很重要,因为它是本机调用。
我正在试用 VS 2019 预览版 2,它给了我以前从未见过的警告。 rect 中的所有字段都会生成相同的警告:
CA1051 Do not declare visible instance fields
在其余代码中,我通过附加 {get;set;} 将字段转换为属性来解决此问题。我不知道我是否可以在布局很重要的结构中安全地做到这一点。
Rect 还警告我应该覆盖 Equals。
CA1815 Rect should override Equals.
CA1815 Rect should override the equality (==) and inequality (!=) operators.
虽然我从不比较它,而且绝对不需要,我只是想修复警告。
public static class NativeMethods
{
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
public static IntPtr _GetForegroundWindow()
{
return GetForegroundWindow();
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetDesktopWindow();
public static IntPtr _GetDesktopWindow()
{
return GetDesktopWindow();
}
//Am unable to get code analysis to shut up about this.
[DllImport("user32.dll")]
private static extern int GetWindowRect(IntPtr hWnd, ref Rect rect);
public static IntPtr _GetWindowRect(IntPtr hWnd, ref Rect rect)
{
return (IntPtr)GetWindowRect(hWnd, ref rect);
}
}
[StructLayout(LayoutKind.Sequential)]
public struct Rect
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
如何解决这些警告?
【问题讨论】:
-
正如我在问题中所说(在代码的其余部分,我通过附加 {get;set;} 将字段转换为属性来解决此问题。我不知道我是否可以在布局很重要的结构中安全地执行此操作。)这就是我通常修复它的方式。这是一种特殊情况,因为它是本机调用中使用的结构。 {get;set;} 将生成一个 getter 和 setter,可能会改变结构的布局。你确定 {get;set;} 是安全的吗?
-
忽略这种特殊情况下的警告。
-
@Dirk 我知道你可以这样做,而且可能没问题,但我希望有更好的解决方案。
-
这些是互操作类型,其形状由外部(非 C#)力量决定。你不能保证任何互操作类型都符合良好的 C# 实践,所以我肯定会在这里查看抑制。
-
@IvanStoev 将其标记为内部修复!请添加您的答案,以便我标记它。
标签: c# winapi pinvoke compiler-warnings