İngilizce dilinde oku

Aracılığıyla paylaş


Yansıma değişiklikleri API özel durumlarını çağırır

Yansıma çağırma API'leri çağrılırken oluşan özel durumlar değişti.

Önceki davranış

  • Daha önce, başvuruya göre bir değer döndüren çağrılan bir yöntem döndürdüğünde nullbir NullReferenceException oluşturuldu.

  • Oluşturucular için aşağıdaki özel durumlar oluşturuldu:

  • Değiştirici olmadan ref byref benzeri bir parametre için geçirildiğinde null (yani, değer tarafından geçirildi), özel durum oluşturmadı ve çalışma zamanı null değer için varsayılan bir değerle değiştirdi.

Yeni davranış

.NET 7'den başlayarak:

  • İlk parametreler doğrulandıktan sonra Invoke() her durumda kaynak özel durum (Önceki davranış dahil NullReferenceException ve OutOfMemoryException bahsedilir) TargetInvocationException atmak yerine oluşturulur. İç özel durum, kaynak özel durumu içerir.

  • NotSupportedExceptionparametresi "değere göre" olarak bildirildiğinde (yani değiştiricisi olmadığındaref) byref benzeri bir parametre için geçirildiğinde null oluşturulur. Parametre başvuruyla geçirildiğinde (yani değiştiriciye sahip ref olduğunda) ilgili durum için, önceki ve yeni davranış aynıdır: a NotSupportedException oluşturulur.

Sürüm kullanıma sunulmuştur

.NET 7

Hataya neden olan değişikliğin türü

Bu değişiklik ikili uyumluluğu etkileyebilir.

Değişiklik nedeni

TargetInvocationException Kaynak özel durum yerine oluşturma, deneyimi daha tutarlı hale getirir. Gelen parametrelerin doğrulanmasından kaynaklanan özel durumları (ile TargetInvocationExceptionsarmalanmamış) ve hedef yöntemin uygulanmasından (sarmalanan) kaynaklanan özel durumları düzgün bir şekilde katmanlar. Tutarlı kurallar, CLR ve Invoke API'lerin farklı uygulamaları arasında daha tutarlı deneyimler sağlar.

Byref benzeri bir tür API'ye Invoke() geçirildiğinde atılan NotSupportedException değişiklik, özgün uygulamanın bir gözetimini düzeltir ve oluşturmaz. Özgün uygulama, türlerin ref struct API'ler tarafından Invoke() desteklenmediği durumlarda desteklendiğini gösterir. Geçerli Invoke() API'ler parametre türleri için kullanıldığından System.Object ve türü ref struct için System.Objectkutulanabildiğinden, bu desteklenmeyen bir senaryodur.

çağrısı Invoke()yaparken kullanmıyorsanız BindingFlags.DoNotWrapExceptions ve dışında TargetInvocationExceptionözel durumlar için API'lerin çevresinde Invoke() deyimleriniz varsacatch, bu catch deyimleri değiştirmeyi veya kaldırmayı göz önünde bulundurun. Çağrının sonucu olarak diğer özel durumlar artık oluşturulmayacak. Ancak, hedef yöntemi çağırmaya çalışmadan önce gerçekleşen bağımsız değişken doğrulama özel durumlarını yakalıyorsanız, bu catch deyimleri tutmanız gerekir. Çağrılmadan önce doğrulanan geçersiz bağımsız değişkenler ile TargetInvocationException sarmalanmadan oluşturulur ve semantiği değiştirmez.

Hiçbir zaman atılmış olmayacak TargetInvocationException şekilde kullanmayı BindingFlags.DoNotWrapExceptions göz önünde bulundurun. Bu durumda, kaynak özel durum tarafından TargetInvocationExceptionsarmalanmayacak. Çoğu durumda, özel durumun sarmalanmaması, tüm özel durum raporlama araçları iç özel durumu görüntülemediğinden gerçek sorunu tanılama olasılığını artırır. Buna ek olarak, kullanılarak BindingFlags.DoNotWrapExceptionsyöntemi doğrudan çağırırken olduğu gibi aynı özel durumlar oluşturulur (yansıma olmadan). Yansımanın kullanılıp kullanılmayacağının seçimi rastgele olabileceğinden veya çağıranın ortaya çıkarması gerekmeyen bir uygulama ayrıntısı olabileceğinden, çoğu durumda bu tercih edilir.

"Değere göre" geçirilen byref benzeri bir parametre içeren yansıma aracılığıyla bir yönteme varsayılan değer geçirmeniz gerektiğinde, parametresini atlayan ve hedef yöntemi bu parametre için varsayılan değerle çağıran bir sarmalayıcı yöntemi ekleyebilirsiniz.

Etkilenen API’ler