将P/Invokes移动到NativeMethods类因为它是P/Invoke方法消息

Dev*_*per 3 .net c# pinvoke

有人可以建议我该如何处理这条消息?

CA1060将P/Invokes移动到NativeMethods类因为它是P/Invoke方法,所以应该在名为NativeMethods,SafeNativeMethods或UnsafeNativeMethods的类中定义'UControl.InternetGetConnectedState(out int,int)'.兆.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);
Run Code Online (Sandbox Code Playgroud)

谢谢!

Bas*_*sie 7

要摆脱警告,只需将您的P/Invoke方法添加到下面的一个类(通常NativeMethods).如果要创建可重用的库,则应将其放入UnsafeNativeMethods或中SafeNativeMethods.


MSDN页

若要修复违反此规则的问题,请将方法移至相应的NativeMethods类.对于大多数应用程序,将P/Invokes移动到名为NativeMethods的新类就足够了.

NativeMethods他们推荐使用3个类:

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);   
}
Run Code Online (Sandbox Code Playgroud)

有关于这一些讨论在这里,和上面链接的文章给出了何时使用各3班的一些建议:

NativeMethods

由于不应使用SuppressUnmanagedCodeSecurityAttribute标记NativeMethods类,因此放入其中的P/Invokes将需要UnmanagedCode权限.因为大多数应用程序从本地计算机运行并与完全信任一起运行,所以这通常不是问题.但是,如果要开发可重用库,则应考虑定义SafeNativeMethodsUnsafeNativeMethods类.

SafeNativeMethods

可以安全地暴露给任何应用程序并且没有任何副作用的P/Invoke方法应该放在名为SafeNativeMethods的类中.您不必要求权限,也不必过多关注它们的调用位置.

UnsafeNativeMethods

不能安全调用并且可能导致副作用的P/Invoke方法应该放在名为UnsafeNativeMethods的类中.应严格检查这些方法,以确保它们不会无意中暴露给用户.规则CA2118:查看SuppressUnmanagedCodeSecurityAttribute用法可以帮助解决此问题.或者,这些方法在使用时应具有另一个需要的权限,而不是UnmanagedCode.