مشاركة عبر


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

راجع أيضًا:

موارد أخرى

تحذيرات التصميم