有人可以建议我该如何处理此消息?
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);
谢谢!
答案 0 :(得分:7)
要摆脱警告,只需将P/Invoke
方法添加到以下某个类(通常为NativeMethods
)。如果您要创建可重用的库,则应将其放在UnsafeNativeMethods
或SafeNativeMethods
中。
要修复违反此规则的问题,请将方法移至相应的 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);
}
}