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 LocalFree
bir 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 ; true C# 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 Assert
SecurityAction , Deny
ve 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 , SecurityActionAssert
Deny
ve 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 Assert
platform çağırma örneklerine benzer şekilde , Deny
ve 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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin