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

时间:2012-11-27 18:12:39

标签: c# .net pinvoke

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

  

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

谢谢!

2 个答案:

答案 0 :(得分:7)

要摆脱警告,只需将P/Invoke方法添加到以下某个类(通常为NativeMethods)。如果您要创建可重用的库,则应将其放在UnsafeNativeMethodsSafeNativeMethods中。

msdn page

  

要修复违反此规则的问题,请将方法移至相应的 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);   
}

关于这个here有一些讨论,上面链接的文章提供了关于何时使用3个类中的每个类的一些建议:

<强> NativeMethods

  

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

<强> SafeNativeMethods

  

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

<强> UnsafeNativeMethods

  

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

答案 1 :(得分:2)

喔!

我找到了答案

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);
        }
    }