Aracılığıyla paylaş


Yönetilen Kodda Prototipler Oluşturma

Bu konu başlığında yönetilmeyen işlevlere nasıl erişileceği açıklanır ve yönetilen kodda yöntem tanımına açıklama ekleyen çeşitli öznitelik alanları tanıtılır. oluşturmayı gösteren örnekler için. Platform çağırma ile kullanılacak NET tabanlı bildirimler, bkz . Platform Çağırma ile Verileri Sıralama.

Yönetilen koddan yönetilmeyen bir DLL işlevine erişebilmeniz için önce işlevin adını ve dışarı aktaran DLL'nin adını bilmeniz gerekir. Bu bilgilerle, DLL'de uygulanan yönetilmeyen bir işlev için yönetilen tanımı yazmaya başlayabilirsiniz. Ayrıca, platform çağrısının işlevi oluşturma ve işlevden verileri sıralama biçimini ayarlayabilirsiniz.

Not

Bir dize ayıran Windows API işlevleri gibi LocalFreebir yöntem kullanarak dizeyi serbest etmenizi sağlar. Platform çağrısı bu tür parametreleri farklı işler. Platform çağırma çağrıları için parametresini IntPtr tür yerine bir String tür yapın. Türü bir dizeye el ile dönüştürmek ve el ile serbest getirmek için sınıfı tarafından System.Runtime.InteropServices.Marshal sağlanan yöntemleri kullanın.

BildirimLe ilgili Temel Bilgiler

Yönetilmeyen işlevlere yönelik yönetilen tanımlar, aşağıdaki örneklerde görebileceğiniz gibi dile bağlıdır. Daha eksiksiz kod örnekleri için bkz . Platform Çağırma Örnekleri.

Friend Class NativeMethods
    Friend Declare Auto Function MessageBox Lib "user32.dll" (
        ByVal hWnd As IntPtr,
        ByVal lpText As String,
        ByVal lpCaption As String,
        ByVal uType As UInteger) As Integer
End Class

Bir Visual Basic bildirimine , , , , , DllImportAttribute.SetLastErrorveya DllImportAttribute.ThrowOnUnmappableChar alanlarını uygulamak için deyimi yerine özniteliğini Declare kullanmanız DllImportAttribute gerekir. DllImportAttribute.PreserveSigDllImportAttribute.ExactSpellingDllImportAttribute.CallingConventionDllImportAttribute.BestFitMapping

Imports System.Runtime.InteropServices

Friend Class NativeMethods
    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
    Friend Shared Function MessageBox(
        ByVal hWnd As IntPtr,
        ByVal lpText As String,
        ByVal lpCaption As String,
        ByVal uType As UInteger) As Integer
    End Function
End Class
using System;
using System.Runtime.InteropServices;

internal static class NativeMethods
{
    [DllImport("user32.dll")]
    internal static extern int MessageBox(
        IntPtr hWnd, string lpText, string lpCaption, uint uType);
}
using namespace System;
using namespace System::Runtime::InteropServices;

[DllImport("user32.dll")]
extern "C" int MessageBox(
    IntPtr hWnd, String* lpText, String* lpCaption, unsigned int uType);

Tanımı Ayarlama

Bunları açıkça ayarlasanız da ayarlamasanız da, öznitelik alanları yönetilen kodun davranışını tanımlıyor. Platform çağrısı, bir derlemede meta veri olarak var olan çeşitli alanlarda ayarlanan varsayılan değerlere göre çalışır. Bir veya daha fazla alanın değerlerini ayarlayarak bu varsayılan davranışı değiştirebilirsiniz. Çoğu durumda değerini ayarlamak için öğesini DllImportAttribute kullanırsınız.

Aşağıdaki tabloda, platform çağrısıyla ilgili öznitelik alanlarının tamamı listelemektedir. Tablo, her alan için varsayılan değeri ve yönetilmeyen DLL işlevlerini tanımlamak için bu alanların nasıl kullanılacağına ilişkin bilgilerin bağlantısını içerir.

Alan Açıklama
BestFitMapping En uygun eşlemeyi etkinleştirir veya devre dışı bırakır.
CallingConvention Geçiş yöntemi bağımsız değişkenlerinde kullanılacak çağırma kuralını belirtir. Varsayılan değer, 32 bit Intel tabanlı platformlara __stdcall karşılık gelen şeklindedirWinAPI.
CharSet Ad sıralamasını ve dize bağımsız değişkenlerinin işleve göre sıralama şeklini denetler. Varsayılan değer: CharSet.Ansi.
EntryPoint Çağrılacak DLL giriş noktasını belirtir.
ExactSpelling Bir giriş noktasının karakter kümesine karşılık gelen şekilde değiştirilmesi gerekip gerekmediğini denetler. Varsayılan değer programlama diline göre değişir.
PreserveSig Yönetilen yöntem imzasının HRESULT döndüren ve dönüş değeri için ek bir [out, retval] bağımsız değişkeni olan yönetilmeyen imzaya dönüştürülüp dönüştürülmeyeceğini denetler.

Varsayılan değerdir true (imza dönüştürülmemelidir).
SetLastError Çağıranın, yöntemini yürütürken bir hata oluşup oluşmadığını belirlemek için API işlevini kullanmasını Marshal.GetLastWin32Error sağlar. Visual Basic'te varsayılan değer ; trueC# ve C++'da varsayılan değerdir false.
ThrowOnUnmappableChar ANSI "?" karakterine dönüştürülen, uygulamaz bir Unicode karakterine özel durum oluşturan denetimleri.

Ayrıntılı başvuru bilgileri için bkz DllImportAttribute. .

Platform çağırma güvenlik konuları

Numaralandırmanın AssertSecurityAction , Denyve PermitOnly üyeleri yığın kılavuzu değiştiricileri olarak adlandırılır. Platform çağırma bildirimlerinde ve COM Arabirim Tanımlama Dili (IDL) deyimlerinde bildirim temelli öznitelikler olarak kullanılırlarsa bu üyeler yoksayılır.

Platform Çağırma Örnekleri

Bu bölümdeki platform çağırma örnekleri, özniteliğin RegistryPermission yığın kılavuzu değiştiricileriyle kullanımını gösterir.

Aşağıdaki örnekte , SecurityActionAssertDenyve PermitOnly değiştiricileri yoksayılır.

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]  
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]  
    private static extern bool CallRegistryPermissionAssert();  
  
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]  
[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]  
    private static extern bool CallRegistryPermissionDeny();  
  
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]  
[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]  
    private static extern bool CallRegistryPermissionDeny();  

Ancak, Demand aşağıdaki örnekteki değiştirici kabul edilir.

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]  
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]  
    private static extern bool CallRegistryPermissionDeny();  

SecurityAction değiştiricileri, platform çağırma çağrısını içeren (sarmalayan) bir sınıfa yerleştirilirse düzgün çalışır.

      [RegistryPermission(SecurityAction.Demand, Unrestricted = true)]  
public ref class PInvokeWrapper  
{  
public:  
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]  
    private static extern bool CallRegistryPermissionDeny();  
};  
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]  
class PInvokeWrapper  
{  
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]  
    private static extern bool CallRegistryPermissionDeny();  
}  

SecurityAction değiştiricileri, platform çağırma çağrısının çağıranın üzerine yerleştirildikleri iç içe geçmiş bir senaryoda da düzgün çalışır:

      {  
public ref class PInvokeWrapper  
public:  
    [DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]  
    private static extern bool CallRegistryPermissionDeny();  
  
    [RegistryPermission(SecurityAction.Demand, Unrestricted = true)]  
    public static bool CallRegistryPermission()  
    {  
     return CallRegistryPermissionInternal();  
    }  
};  
class PInvokeScenario  
{  
    [DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]  
    private static extern bool CallRegistryPermissionInternal();  
  
    [RegistryPermission(SecurityAction.Assert, Unrestricted = true)]  
    public static bool CallRegistryPermission()  
    {  
     return CallRegistryPermissionInternal();  
    }  
}  

COM Birlikte Çalışma Örnekleri

Bu bölümdeki COM birlikte çalışma örnekleri, özniteliğin RegistryPermission yığın kılavuzu değiştiricileriyle kullanımını gösterir.

Aşağıdaki COM birlikte çalışma arabirimi bildirimleri, önceki bölümdeki Assertplatform çağırma örneklerine benzer şekilde , Denyve PermitOnly değiştiricilerini yoksayar.

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]  
interface IAssertStubsItf  
{  
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]  
    bool CallRegistryPermission();  
[FileIOPermission(SecurityAction.Assert, Unrestricted = true)]  
    bool CallFileIoPermission();  
}  
  
[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]  
interface IDenyStubsItf  
{  
[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]  
    bool CallRegistryPermission();  
[FileIOPermission(SecurityAction.Deny, Unrestricted = true)]  
    bool CallFileIoPermission();  
}  
  
[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]  
interface IAssertStubsItf  
{  
[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]  
    bool CallRegistryPermission();  
[FileIOPermission(SecurityAction.PermitOnly, Unrestricted = true)]  
    bool CallFileIoPermission();  
}  

Ayrıca değiştirici, Demand aşağıdaki örnekte gösterildiği gibi COM birlikte çalışma arabirimi bildirim senaryolarında kabul edilmemektedir.

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]  
interface IDemandStubsItf  
{  
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]  
    bool CallRegistryPermission();  
[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]  
    bool CallFileIoPermission();  
}  

Ayrıca bkz.