Aracılığıyla paylaş


openGenericCERCall 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.

Yönetilen openGenericCERCall hata ayıklama yardımcısı, kök yöntemde genel tür değişkenleri olan kısıtlanmış yürütme bölgesi (CER) grafiğinin JIT derleme veya yerel görüntü oluşturma zamanında işlendiği ve genel tür değişkenlerinden en az birinin nesne başvuru türü olduğu konusunda uyarmak için etkinleştirilir.

Belirtiler

BIR iş parçacığı durdurulduğunda veya uygulama etki alanı kaldırıldığında CER kodu çalışmaz.

Neden

JIT derleme zamanında, sonuç kodu paylaşıldığından ve nesne başvuru türü değişkenlerinden her biri herhangi bir nesne başvuru türü olabileceğinden, nesne başvuru türünü içeren bir örnekleme yalnızca temsilidir. Bu, bazı çalışma zamanı kaynaklarının önceden hazırlanmasını engelleyebilir.

Özellikle, genel tür değişkenlerine sahip yöntemler arka planda kaynakları serbestçe ayırabilir. Bunlar genel sözlük girdileri olarak adlandırılır. Örneğin, genel bir tür değişkeni olan T deyimi List<T> list = new List<T>(); için çalışma zamanının arama yapması ve çalışma zamanında tam örnekleme oluşturması gerekir, örneğin, List<Object>, List<String>vb. . Bu, geliştiricinin denetimi dışında bellek yetersizliği gibi çeşitli nedenlerle başarısız olabilir.

Bu MDA yalnızca JIT derleme zamanında etkinleştirilmelidir, tam bir örnekleme olduğunda etkinleştirilmemelidir.

Bu MDA etkinleştirildiğinde, olası belirtiler CER'lerin kötü örneklemeler için işlevsel olmamasıdır. Aslında çalışma zamanı, MDA'nın etkinleştirilmesine neden olan koşullar altında bir CER uygulamaya çalışmamıştır. Bu nedenle geliştirici, CER'in paylaşılan bir örneğini kullanıyorsa JIT derleme hataları, genel tür yükleme hataları veya hedeflenen CER'nin bölgesinde iş parçacığı durdurmaları yakalanmaz.

Çözüm

CER içerebilecek yöntemler için nesne başvuru türünde genel tür değişkenleri kullanmayın.

Çalışma Zamanı üzerindeki etkisi

Bu MDA'nın CLR üzerinde hiçbir etkisi yoktur.

Çıktı

Aşağıda bu MDA'dan alınan bir çıktı örneği verilmiştir:

Method 'GenericMethodWithCer', which contains at least one constrained execution region, cannot be prepared automatically since it has one or more unbound generic type parameters.
The caller must ensure this method is prepared explicitly at run time prior to execution.
method name="GenericMethodWithCer"
declaringType name="OpenGenericCERCall"

Yapılandırma

<mdaConfig>
  <assistants>
    <openGenericCERCall/>
  </assistants>
</mdaConfig>

Örnek

CER kodu yürütülmedi.

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

class Program
{
    static void Main(string[] args)
    {
        CallGenericMethods();
    }
    static void CallGenericMethods()
    {
        // This call is correct. The instantiation of the method
        // contains only nonreference types.
        MyClass.GenericMethodWithCer<int>();

        // This call is incorrect. A shared version of the method that
        // cannot be completely analyzed will be JIT-compiled. The
        // MDA will be activated at JIT-compile time, not at run time.
        MyClass.GenericMethodWithCer<String>();
    }
}

class MyClass
{
    public static void GenericMethodWithCer<T>()
    {
        RuntimeHelpers.PrepareConstrainedRegions();
        try
        {

        }
        finally
        {
            // This is the start of the CER.
            Console.WriteLine("In finally block.");
        }
    }
}

Ayrıca bkz.