Aracılığıyla paylaş


Yönetilen Kodda Prototip 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. Platform çağrısı ile kullanılacak .NET tabanlı bildirimlerin nasıl oluşturulacağını gösteren örnekler için Platform Çağırma ile Verileri Dönüştürme bölümüne bakın.

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.

Uyarı

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 parametreyi IntPtr tür yerine String tür yapın. Türü bir dizeye manuel olarak dönüştürmek ve manuel olarak serbest bırakmak için System.Runtime.InteropServices.Marshal sınıfı tarafından 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.BestFitMapping, DllImportAttribute.CallingConvention, DllImportAttribute.ExactSpelling, DllImportAttribute.PreserveSig, DllImportAttribute.SetLastError veya DllImportAttribute.ThrowOnUnmappableChar alanlarını uygulamak için DllImportAttribute deyimi yerine Declare özniteliğini kullanmanız gerekir.

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. Birçok durumda, bir değeri ayarlamak için DllImportAttribute öğesini 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 iyi uyum eşlemesini etkinleştirir veya devre dışı bırakır.
CallingConvention Yöntem bağımsız değişkenlerini aktarırken kullanılacak çağrı kuralını belirtir. Varsayılan değer, 32 bit Intel tabanlı platformlara WinAPI karşılık gelen şeklindedir__stdcall.
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 Haritalanamayan bir Unicode karakterinin ANSI "?" karakterine dönüştürülmesi ile özel durum fırlatılması denetimi sağlar.

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

Platform çağırma güvenlik konuları

Numaralandırma türünün Assert, Deny, ve PermitOnly üyeleri SecurityAction 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ğrısı Örnekleri

Bu bölümdeki platform çağırma örnekleri, RegistryPermission özniteliğinin yığın geçiş 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, çağrının yapıldığı platform çağrısının üstüne yerleştirildiklerinde, iç içe geçmiş bir senaryoda da doğru şekilde ç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 Etkileşim Örnekleri

Bu bölümdeki COM birlikte çalışma örnekleri, RegistryPermission özniteliğinin yığın yürüyüşü 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 bakınız