Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET 7, C# kodunda LibraryImportAttribute tanıyan P/Invoke'lar için bir kaynak jeneratörü sunar.
Kaynak oluşturma kullanılmadığında, .NET çalışma zamanındaki yerleşik birlikte çalışma sistemi, yönetilen koddan yönetilmeyen koda geçişi kolaylaştırmak için çalışma anında JIT ile derlenen bir IL yönergeleri akışına sahip bir IL stub oluşturur. Aşağıdaki kod, bu mekanizmayı kullanan bir P/Invoke tanımlamayı ve çağırmayı gösterir:
[DllImport(
"nativelib",
EntryPoint = "to_lower",
CharSet = CharSet.Unicode)]
internal static extern string ToLower(string str);
// string lower = ToLower("StringToConvert");
IL saplama, parametrelerin ve dönüş değerlerinin sıralanmasıyla ilgilenir ve yönetilmeyen kodu çağırırken, yönetilmeyen kodun nasıl çağrılması gerektiğini etkileyen ayarlara DllImportAttribute riayete eder (örneğin, SetLastError). Bu IL saplaması çalışma zamanında oluşturulduğundan, önceden (AOT) derleyici veya IL kırpma senaryoları için kullanılamaz. IL'nin oluşturulması, marshalling için dikkate alınması gereken önemli bir maliyeti temsil eder. Bu maliyet, dinamik kod oluşturulmasına izin vermeyebilir olası hedef platformlar için uygulama performansı ve destek açısından ölçülebilir.
Yerel AOT uygulama modeli, tüm kodları önceden doğrudan yerel koda önceden derleyerek dinamik kod oluşturmayla ilgili sorunları giderir. Tam Yerel AOT senaryoları gerektiren platformlarda DllImport kullanmak bir seçenek değildir; bu nedenle, diğer yaklaşımlar (örneğin, kaynak oluşturma) daha uygundur. Senaryolarda gruplama mantığında DllImport hata ayıklamak da karmaşık bir süreçtir.
.NET 7 SDK'sına dahil edilen ve varsayılan olarak etkinleştirilen P/Invoke kaynak oluşturucu, derleme zamanı kaynak oluşturma işlemini tetiklemek için bir LibraryImportAttribute, static, ve partial yöntemini arar, böylece çalışma zamanında IL saplaması oluşturma gereksinimini ortadan kaldırır ve P/Invoke'un satır içine alınmasına izin verir.
Çözümleyiciler ve kod düzelticiler, yerleşik sistemden kaynak oluşturucuya ve genel kullanımla geçişe yardımcı olmak için de dahil edilir.
Temel kullanım
LibraryImportAttribute, kullanım açısından DllImportAttribute ile benzer şekilde tasarlanmıştır. Önceki örneği P/Invoke kaynak oluşturmayı kullanacak şekilde dönüştürebiliriz, bunun için LibraryImportAttribute kullanarak ve yöntemi extern yerine partial olarak işaretleyerek:
[LibraryImport(
"nativelib",
EntryPoint = "to_lower",
StringMarshalling = StringMarshalling.Utf16)]
internal static partial string ToLower(string str);
Derleme sırasında, kaynak oluşturucu, ToLower parametresinin ve dönüş değerinin UTF-16 olarak sıralanmasıyla ilgilenen string yönteminin bir uygulamasını oluşturmak için tetiklenir. Artık sıralama kaynak kodu oluşturulduğundan, bir hata ayıklayıcıda mantığa bakabilir ve bu mantıkta adım adım ilerleyebilirsiniz.
MarshalAs
Kaynak oluşturucu ayrıca MarshalAsAttribute ifadesine de saygı gösterir. Yukarıdaki kod şu şekilde de yazılabilir:
[LibraryImport(
"nativelib",
EntryPoint = "to_lower")]
[return: MarshalAs(UnmanagedType.LPWStr)]
internal static partial string ToLower(
[MarshalAs(UnmanagedType.LPWStr)] string str);
Bazı ayarlar MarshalAsAttribute için desteklenmez. Desteklenmeyen ayarları kullanmaya çalışırsanız kaynak oluşturucu bir hata yayar. Daha fazla bilgi için bkz . DllImport'tan farklar.
Çağırma kuralı
Çağırma kuralını belirtmek için kullanın UnmanagedCallConvAttribute, örneğin:
[LibraryImport(
"nativelib",
EntryPoint = "to_lower",
StringMarshalling = StringMarshalling.Utf16)]
[UnmanagedCallConv(
CallConvs = new[] { typeof(CallConvStdcall) })]
internal static partial string ToLower(string str);
Arasındaki farklar DllImport
LibraryImportAttribute, çoğu durumda DllImportAttribute'den doğrudan bir dönüşüm olarak tasarlanmıştır, ancak bazı kasıtlı değişiklikler vardır:
- CallingConvention üzerinde LibraryImportAttributeeşdeğeri yoktur. UnmanagedCallConvAttribute yerine kullanılmalıdır.
- CharSet (için CharSet) StringMarshalling (için StringMarshalling) ile değiştirildi. ANSI kaldırıldı ve UTF-8 artık birinci sınıf bir seçenek olarak kullanılabilir.
-
BestFitMapping ve ThrowOnUnmappableChar eşdeğeri yoktur. Bu alanlar yalnızca Windows'da ansi dizesinin hazırlaması sırasında geçerlidir. ANSI dizisini taşımak için üretilen kod,
BestFitMapping=falseveThrowOnUnmappableChar=falseile eşdeğer bir işlevselliğe sahip olacaktır. -
ExactSpelling eşdeğeri yoktur. Bu alan Windows merkezli bir ayardı ve Windows dışı işletim sistemleri üzerinde hiçbir etkisi yoktu. Yöntem adı veya EntryPoint giriş noktası adının tam yazımı olmalıdır. Bu alan, Win32 programlamasında kullanılan
AveWsoneklerine yönelik tarihsel kullanımlara sahiptir. - PreserveSig eşdeğeri yoktur. Bu alan Windows merkezli bir ayardı. Oluşturulan kod her zaman doğrudan imzayı çevirir.
- Proje AllowUnsafeBlocks kullanılarak güvenli değil olarak işaretlenmelidir.
Bazı ayarların MarshalAsAttribute üzerinde desteklenmesinde, belirli türlerin varsayılan marshalleme işleminde ve diğer birlikte çalışabilirlikle ilgili özniteliklerde de farklılıklar vardır. Daha fazla bilgi için uyumluluk farklılıklarıyla ilgili belgelerimize bakın.