将P/Invoke移到NativeMethods类中,因为它是一个P/Invoke方法消息。

4

有人能建议我对这个消息该怎么处理吗?

CA1060 将P/Invoke方法移动到NativeMethods类中 由于'UControl.InternetGetConnectedState(out int, int)'是P/Invoke方法,所以应当将其定义在NativeMethods、SafeNativeMethods或UnsafeNativeMethods命名的类中。 Mega.UControl.xaml.cs 33

代码:

namespace Mega
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UControl 
    { 
        [DllImport("wininet.dll")]
        private extern static bool InternetGetConnectedState(out int description, int reservedValue);

感谢您!

1
你是在问如何禁用规则还是创建一个名为NativeMethods的类?有什么让你感到困惑的吗? - ChaosPandion
@ChaosPandion 创建名为NativeMethods的类,并执行代码分析器要求的所有更改... - NoWar
1
我认为你的大脑被信息的措辞所迷惑了。仔细阅读它。你显然知道如何创建一个类。 - ChaosPandion
2个回答

9
要消除警告,只需将您的P/Invoke方法添加到以下类之一中(通常是NativeMethods)。如果您正在创建可重用库,则应将这些方法放在UnsafeNativeMethodsSafeNativeMethods中。
MSDN页面上说:

要修复此规则的违规行为,请将该方法移动到适当的NativeMethods类。对于大多数应用程序,将P/Invokes移动到名为NativeMethods的新类就足够了。

有3个NativeMethods类推荐使用:

NativeMethods - 这个类不会抑制非托管代码权限的堆栈行走。(不能将System.Security.SuppressUnmanagedCodeSecurityAttribute应用于此类。)此类是用于可以在任何地方使用的方法,因为将执行堆栈行走。

SafeNativeMethods - 这个类抑制非托管代码权限的堆栈行走。(将System.Security.SuppressUnmanagedCodeSecurityAttribute应用于此类。)此类是用于任何人都可以调用的方法。调用这些方法的人不需要执行完整的安全审核,以确保使用是安全的,因为这些方法对于任何调用者都是无害的。

UnsafeNativeMethods - 这个类抑制非托管代码权限的堆栈行走。(将System.Security.SuppressUnmanagedCodeSecurityAttribute应用于此类。)此类是用于潜在危险方法的方法。任何这些方法的调用者必须执行完整的安全审核,以确保使用是安全的,因为将不执行堆栈行走。

但是大多数时候只使用NativeMethods类即可(这将至少消除您看到的警告)。
internal static class NativeMethods    
{        
    [DllImport("kernel32.dll")]
    internal static extern bool RemoveDirectory(string name);   
}

这里有一些关于此问题的讨论,此处链接,上面的文章提供了使用每个类的建议:

NativeMethods

由于不应在NativeMethods类中使用SuppressUnmanagedCodeSecurityAttribute标记,在其中放置的P/Invoke将需要UnmanagedCode权限。由于大多数应用程序从本地计算机运行并以完全信任模式运行,所以这通常不是问题。但是,如果您正在开发可重用的库,则应考虑定义一个SafeNativeMethodsUnsafeNativeMethods类。

SafeNativeMethods

可以安全公开且没有任何副作用的P/Invoke方法应该放在名为SafeNativeMethods的类中。您不必要求权限,也不必过多关注它们从哪里调用。

UnsafeNativeMethods

不能安全调用且可能会导致副作用的P/Invoke方法应该放在名为UnsafeNativeMethods的类中。应仔细检查这些方法以确保它们不会无意中向用户公开。规则CA2118:审查SuppressUnmanagedCodeSecurityAttribute使用可帮助解决此问题。或者,当使用这些方法时,应该要求另一种权限而不是UnmanagedCode


3

哦!

我找到了一个答案

https://msdn.microsoft.com/library/ms182161.aspx

(注:此文本已经是中文,无需翻译)
using System;
using System.Runtime.InteropServices;

    namespace DesignLibrary
    {
    // Violates rule: MovePInvokesToNativeMethodsClass.
        internal class UnmanagedApi
        {
            [DllImport("kernel32.dll")]
            internal static extern bool RemoveDirectory(string name);
        }
    }

3
我想这只是一个警告,但最好的做法是将其添加到NativeMethodsSafeNativeMethodsUnsafeNativeMethods中。这里有一些很好的答案:https://dev59.com/ZVzUa4cB1Zd3GeqP3GsJ - Bassie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接