Aracılığıyla paylaş


invalidCERCall MDA

Not

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

invalidCERCall Yönetilen hata ayıklama yardımcısı (MDA), kısıtlanmış yürütme bölgesi (CER) grafı içinde güvenilirlik sözleşmesi olmayan veya aşırı zayıf bir sözleşmeye sahip bir yönteme çağrı olduğunda etkinleştirilir. Zayıf sözleşme, en kötü durum durumu bozulmasının çağrıya geçirilen örnekten daha büyük bir kapsamda olduğunu, yani veya işlem durumunun AppDomain bozulabileceğini veya cer içinde çağrıldığında sonucunun her zaman belirlenebilir olarak hesaplanabilir olmadığını bildiren bir sözleşmedir.

Belirtiler

CER'de kod yürütülürken beklenmeyen sonuçlar. Belirtiler spesifik değildir. Çalışma zamanı onu önceden hazırlamadığından veya çalışma zamanında özel durumlardan korumadığındanThreadAbortException, güvenilir olmayan yöntem çağrısında beklenmeyen OutOfMemoryException, bir ThreadAbortExceptionveya diğer özel durumlar olabilir. Daha büyük bir tehdit, çalışma zamanında yönteminden kaynaklanan herhangi bir özel durumun veya işlemini kararsız bir durumda bırakabileceğidir AppDomain ; bu, CER'in amacına aykırıdır. CER'nin oluşturulmasının nedeni, bunun gibi durum bozulmalarını önlemektir. Tutarlı durum tanımı uygulamalar arasında farklı olduğundan bozuk durum belirtileri uygulamaya özgüdür.

Neden

CER içindeki kod, bir CER'de çalıştırmayla uyumlu olmayan, hayır ReliabilityContractAttribute veya zayıf ReliabilityContractAttribute olan bir işlevi çağırır.

Güvenilirlik sözleşmesi söz dizimi açısından zayıf sözleşme, numaralandırma değeri belirtmeyen Consistency veya , MayCorruptAppDomainveya Nonedeğerini MayCorruptProcessbelirten bir Consistency sözleşmedir. Bu koşullardan herhangi biri, adlı kodun tutarlı durumu korumak için CER'deki diğer kodun çabalarını engelleyebileceklerini gösterir. CER'ler, kodun hataları çok belirleyici bir şekilde işlemesine olanak tanır, uygulama için önemli olan iç sabit değerleri korur ve bellek dışı özel durumlar gibi geçici hatalar karşısında çalışmaya devam etmelerini sağlar.

Bu MDA'nın etkinleştirilmesi, CER'de çağrılan yöntemin çağıranın beklemediği veya ya da işlem durumunu bozuk ya da kurtarılamaz durumda bırakan AppDomain bir şekilde başarısız olma olasılığını gösterir. Elbette, adı verilen kod doğru şekilde yürütülebilir ve sorun yalnızca eksik bir sözleşmedir. Ancak, güvenilir kod yazarken karşılaşılan sorunlar incedir ve sözleşme olmaması, kodun doğru yürütülemeyebilir iyi bir göstergesidir. Sözleşmeler, programcının güvenilir bir şekilde kod verdiği göstergelerdir ve ayrıca kodun gelecekteki düzeltmelerinde bu garantilerin değişmeyeceğine söz verir. Yani, sözleşmeler yalnızca uygulama ayrıntıları değil amaç bildirimleridir.

Zayıf veya var olmayan bir sözleşmeye sahip herhangi bir yöntem tahmin edilemeyen birçok şekilde başarısız olabileceğinden, çalışma zamanı yavaş JIT derleme, genel sözlük popülasyonu veya iş parçacığı durdurmaları tarafından sunulan yöntemden kendi öngörülemeyen hatalarından hiçbirini kaldırmaya çalışmaz. Yani, bu MDA etkinleştirildiğinde, çalışma zamanının tanımlanan CER'de çağrılan yöntemi içermediğini gösterir; Bu alt ağacı hazırlamaya devam etmek olası hatayı maskeleme konusunda yardımcı olacağından çağrı grafiği bu düğümde sonlandırıldı.

Çözüm

İşleve geçerli bir güvenilirlik sözleşmesi ekleyin veya bu işlev çağrısını kullanmaktan kaçının.

Çalışma Zamanı üzerindeki etkisi

CER'den zayıf bir sözleşme çağırmanın etkisi, CER'in işlemlerini tamamlayamaması olabilir. Bu işlem durumunun bozulmasına AppDomain neden olabilir.

Çıktı

Aşağıda bu MDA'dan alınan örnek çıkış verilmiştir.

Method 'MethodWithCer', while executing within a constrained execution region, makes a call at IL offset 0x000C to 'MethodWithWeakContract', which does not have a sufficiently strong reliability contract and might cause non-deterministic results.

Yapılandırma

<mdaConfig>
  <assistants>
    <invalidCERCall />
  </assistants>
</mdaConfig>

Ayrıca bkz.