ca1060: قم بتحريك P/Invokes إلى فئة NativeMethods
TypeName |
MovePInvokesToNativeMethodsClass |
CheckId |
ca1060 |
Category |
Microsoft.تصميم |
تعطيل تغيير |
فصل |
السبب
أسلوب يستخدم "الخدمات استدعاء النظام الأساسي" للوصول إلى تعليمات برمجية غير المدارة و هو ليس عضوا واحداً من الفئات NativeMethods.
وصف القاعدة
أساليب استدعاء النظام الأساسي، مثل كـ تلك التي وضعت لها System.Runtime.InteropServices.DllImportAttributeسمة أو الأساليب التي تم تعريفها باستخدام Declareكلمة أساسية في Visual أساسى Bكـic، الوصول إلى تعليمات برمجية غير المدارة. يجب أن تكون هذه الطرق بأي مما يلي فئات:
NativeMethods-لم منع هذه الفئة تكديس walks لتعليمات برمجية غير مُدارة إذن. (System.Security.SuppressUnmanagedCodeSecurityAttributeيجب أن لا يتم تطبيق إلى هذا فئة.) وهذا فئة هو استخدام الطرق التي يمكن أن تكون في أي مكان لأنه يتم تنفيذ walk مكدس.
SafeNativeMethods-فئة هذا يمنع تكديس walks لتعليمات برمجية غير مُدارة إذن. (System.Security.SuppressUnmanagedCodeSecurityAttributeهو المطبق على ترتيب هو فئة.) Th هو الفئة هو لوظائف أمان لأي شخص للاتصال. غير مطلوبة للمتصلين من هذه الطرق للقيام بمراجعة الأمان كامل للتأكد من أن الاستخدام هو اﻷمن نظراً للأساليب ضرر لأي الطالب.
UnsafeNativeMethods-فئة هذا يمنع تكديس walks لتعليمات برمجية غير مُدارة إذن. (System.Security.SuppressUnmanagedCodeSecurityAttributeهو المطبق على ترتيب هو فئة.) Th هو الفئة هو للأساليب التي تكون خطرة. الطالب أي من هذه الأساليب يجب القيام بمراجعة الأمان كامل للتأكد من أن الاستخدام هو آمنة لأنه سيتم تنفيذه لا walk المكدس.
يتم تعريف ك internal(Friend, في Visual أساسى) هذه الفئات، والتصريح construcإلىr خاصة إلى منع تاريخ الإنشاء مثيلات جديدة. الأساليب الموجودة في هذه فئات يجب أن يكون staticو internal(SharedandFriendin Visual أساسى).
كيف إلى الإصلاح انتهاكات
إلى إصلاح انتهاكا لهذه قاعدة، تحريك الأسلوب إلى مناسبة NativeMethods الفئة. وبالنسبة لمعظم التطبيقات، نقل P/Invokes إلى جديد الفئة التي هو باسم من NativeMethods هو كافية.
ومع ذلك، إذا كنت تقوم بتطوير المكتبات ل استخدم في تطبيقات غير ذلك، يجب عليك تعريف فئتين غير ذلك تسمى SafeNativeMethods و UnsafeNativeMethods . تشبه هذه الفئات NativeMethods الفئة، على الرغم من ذلك، يتم وضع علامة مع سمة خاص تسمى من SuppressUnmanagedCodeSecurityAttribute. عند ترتيب هو سمة هو تطبيق، وقت التشغيل لا يقوم walk ملء مكدس الذاكرة مؤقتة للتأكد من أن الجميع المتصلين permهوsion UnmanagedCode. يتحقق وقت التشغيل عادة من هذا الإذن عند بدء التشغيل. لأنه لن يتم إجراء فحص، فإنه يمكن تحسين الأداء للمكالمات هذه غير مدار إلى حد كبير وظائف، وكما يسمح تعليمات برمجية باستخدام أذونات محددة للاتصال بهذه وظائف.
ومع ذلك، يجب أن تستخدم هذه السمة بعناية كبيرة، لأن المطبقة بشكل غير صحيح، يمكن أن يحتوي ضمانات الأمان خطيرة.
للحصول على معلومات حول كيفية تنفيذ الأساليب، راجع NativeMethods مثال و SafeNativeMethods مثال UnsafeNativeMethods مثال.
عند إلى منع التحذيرات
لا بمنع تحذير من هذه قاعدة.
مثال
يلي مثال يقوم بتعريف أسلوب يخالف هذه قاعدة. لتصحيح الانتهاك، يجب نقلها RemoveDirectory P/Invoke للفئة المناسبة هو فقط لحقل P/Invokes.
Imports System
NameSpace MSInternalLibrary
' Violates rule: MovePInvokesToNativeMethodsClass.
Friend Class UnmanagedApi
Friend Declare Function RemoveDirectory Lib "kernel32" ( _
ByVal Name As String) As Boolean
End Class
End NameSpace
using System;
using System.Runtime.InteropServices;
namespace DesignLibrary
{
// Violates rule: MovePInvokesToNativeMethodsClass.
internal class UnmanagedApi
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern bool RemoveDirectory(string name);
}
}
مثال NativeMethods
الوصف
لأن من NativeMethods فئة يجب أن لا يتم وضع علامة بواسطة من SuppressUnmanagedCodeSecurityAttribute، سيتطلب وضع داخل فيه P/Invokes UnmanagedCode الإذن. نظراً لأن معظم التطبيقات تشغيل من جهاز كمبيوتر محلي، ثم قم بتشغيل ذو الثقة تامة، وترتيب هو هو عادة ليست مشكلة. على الرغم من ذلك، إذا كنت تقوم بتطوير المكتبات القابلة لإعادة الاستخدام، يجب تعريف SafeNativeMethods أو UnsafeNativeMethods فئة.
يلي مثال يظهر تفاعل.Beep أسلوب دالة MessageBeep من user32.dll يلتف. MessageBeep P/Invoke هو وضع داخل NativeMethods الفئة.
الرمز
Imports System
Imports System.Runtime.InteropServices
Imports System.ComponentModel
Public NotInheritable Class Interaction
Private Sub New()
End Sub
' Callers require Unmanaged permission
Public Shared Sub Beep()
' No need to demand a permission as callers of Interaction.Beep
' will require UnmanagedCode permission
If Not NativeMethods.MessageBeep(-1) Then
Throw New Win32Exception()
End If
End Sub
End Class
Friend NotInheritable Class NativeMethods
Private Sub New()
End Sub
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Friend Shared Function MessageBeep(ByVal uType As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
End Class
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
public static class Interaction
{
// Callers require Unmanaged permission
public static void Beep()
{
// No need to demand a permission as callers of Interaction.Beep
// will require UnmanagedCode permission
if (!NativeMethods.MessageBeep(-1))
throw new Win32Exception();
}
}
internal static class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool MessageBeep(int uType);
}
مثال SafeNativeMethods
الوصف
يجب وضع وظائف P/Invoke من أن يتعرض لأي تطبيق آمن والتي لا تتضمن أية تأثيرات جانبية في فئة التي هو باسم من SafeNativeMethods. ليس لديك إلى dem و أذونات و لا يلزم يجب الاهتمام كبيرة جداً بحيث كانت تسمى من.
يلي مثال يظهر بيئة.TickCount خاصية دالة GetTickCount من kernel32.dll يلتف.
الرمز
Imports System
Imports System.Runtime.InteropServices
Imports System.Security
Public NotInheritable Class Environment
Private Sub New()
End Sub
' Callers do not require Unmanaged permission
Public Shared ReadOnly Property TickCount() As Integer
Get
' No need to demand a permission in place of
' UnmanagedCode as GetTickCount is considered
' a safe method
Return SafeNativeMethods.GetTickCount()
End Get
End Property
End Class
<SuppressUnmanagedCodeSecurityAttribute()> _
Friend NotInheritable Class SafeNativeMethods
Private Sub New()
End Sub
<DllImport("kernel32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Friend Shared Function GetTickCount() As Integer
End Function
End Class
using System;
using System.Runtime.InteropServices;
using System.Security;
public static class Environment
{
// Callers do not require UnmanagedCode permission
public static int TickCount
{
get
{
// No need to demand a permission in place of
// UnmanagedCode as GetTickCount is considered
// a safe method
return SafeNativeMethods.GetTickCount();
}
}
}
[SuppressUnmanagedCodeSecurityAttribute]
internal static class SafeNativeMethods
{
[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
internal static extern int GetTickCount();
}
مثال UnsafeNativeMethods
الوصف
يجب وضع وظائف P/Invoke غير آمنة للاتصال بشخص آخر وقد يسبب تأثيرات جانبية في فئة التي هو باسم من UnsafeNativeMethods. يجب فيها هذه الطرق rigorously إلى تأكد من أن أنها لم يتم يتعرض إلى المستخدم بدون قصد. قاعدة ca2118: قم بمراجعة استخدام SuppressUnmanagedCodeSecurityAttributeتساعد مع ذلك. بدلاً من ذلك، يجب أن يكون للأساليب أي إذن آخر demanded في مكان UnmanagedCode عند استخدامهم لها.
يلي مثال يظهر المؤشر.إخفاء أسلوب دالة ShowCursor من user32.dll يلتف.
الرمز
Imports System
Imports System.Runtime.InteropServices
Imports System.Security
Imports System.Security.Permissions
Public NotInheritable Class Cursor
Private Sub New()
End Sub
' Callers do not require Unmanaged permission, however,
' they do require UIPermission.AllWindows
Public Shared Sub Hide()
' Need to demand an appropriate permission
' in place of UnmanagedCode permission as
' ShowCursor is not considered a safe method
Dim permission As New UIPermission(UIPermissionWindow.AllWindows)
permission.Demand()
UnsafeNativeMethods.ShowCursor(False)
End Sub
End Class
<SuppressUnmanagedCodeSecurityAttribute()> _
Friend NotInheritable Class UnsafeNativeMethods
Private Sub New()
End Sub
<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Friend Shared Function ShowCursor(<MarshalAs(UnmanagedType.Bool)> ByVal bShow As Boolean) As Integer
End Function
End Class
using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
public static class Cursor
{
// Callers do not require UnmanagedCode permission, however,
// they do require UIPermissionWindow.AllWindows
public static void Hide()
{
// Need to demand an appropriate permission
// in place of UnmanagedCode permission as
// ShowCursor is not considered a safe method
new UIPermission(UIPermissionWindow.AllWindows).Demand();
UnsafeNativeMethods.ShowCursor(false);
}
}
[SuppressUnmanagedCodeSecurityAttribute]
internal static class UnsafeNativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
internal static extern int ShowCursor([MarshalAs(UnmanagedType.Bool)]bool bShow);
}