4

有人可以建议我与此消息有什么关系吗?

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

谢谢你!

4

2 回答 2

9

要摆脱警告,只需将您的P/Invoke方法添加到以下类之一(通常NativeMethods)。如果你正在创建一个可重用的库,你应该把它们放在UnsafeNativeMethodsSafeNativeMethods中。


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

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

本机方法

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

安全原生方法

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

不安全的原生方法

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

于 2016-11-10T10:03:16.730 回答
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);
        }
    }
于 2012-11-27T18:24:40.393 回答