Aracılığıyla paylaş


Azaltma: Yeni 64 bit JIT Derleyicisi

.NET Framework 4.6'dan başlayarak, çalışma zamanı tam zamanında derleme için yeni bir 64 bit JIT derleyicisi içerir. Bu değişiklik 32 bit JIT derleyicisi ile derlemeyi etkilemez.

Beklenmeyen davranış veya özel durumlar

Bazı durumlarda, yeni 64 bit JIT derleyicisi ile derleme, eski 64 bit JIT derleyicisi tarafından derlenen kod yürütülürken gözlemlenmeyen bir çalışma zamanı özel durumu veya davranışla sonuçlanır. Bilinen farklar şunlardır:

Önemli

Bu bilinen sorunların tümü .NET Framework 4.6.2 ile yayımlanan yeni 64 bit derleyicide giderilmiştir. Çoğu, Windows Update'e dahil edilen .NET Framework 4.6 ve 4.6.1 hizmet sürümlerinde de ele alınmıştır. Windows sürümünüzün güncel olduğundan emin olarak veya .NET Framework 4.6.2'ye yükselterek bu sorunları ortadan kaldırabilirsiniz.

  • Belirli koşullar altında, bir kutu açma işlemi, İyileştirmenin açık olduğu Yayın derlemelerinde bir NullReferenceException oluşturabilir.

  • Bazı durumlarda, üretim kodunun büyük bir yöntem gövdesinde yürütülmesi bir StackOverflowExceptionatabilir.

  • Belirli koşullar altında, bir yönteme geçirilen yapılar Yayın derlemelerinde değer türleri yerine başvuru türleri olarak kabul edilir. Bu sorunun ortaya çıkanlarından biri, bir koleksiyondaki tek tek öğelerin beklenmedik bir sırada görünmesidir.

  • İyileştirme etkinse, belirli koşullar altında değerlerin UInt16 yüksek bit kümesiyle karşılaştırılması yanlıştır.

  • Belirli koşullar altında, özellikle dizi değerlerini başlatırken IL yönergesi OpCodes.Initblk tarafından bellek başlatma, belleği yanlış bir değerle başlatabilir. Bu, işlenmeyen bir özel duruma veya yanlış çıkışa neden olabilir.

  • Bazı nadir koşullarda, derleyici iyileştirmeleri etkinse koşullu bit testi yanlış Boolean değer döndürebilir veya bir özel durum oluşturabilir.

  • Belirli koşullar altında, bir bloğu girmeden önce ve bloktan çıkışta bir koşulu test etmek için bir iftry deyim kullanılırsa ve aynı koşul veya finally bloğunda catch değerlendirilirse, yeni 64 bit JIT derleyicisi kodu iyileştirdiğinde veya finally bloğundan catch koşulu kaldırırif.try Sonuç olarak, veya finally bloğundaki deyiminin ifcatch içindeki kod koşulsuz olarak yürütülür.

Bilinen sorunların azaltılması

Yukarıda listelenen sorunlarla karşılaşırsanız, aşağıdakilerden birini yaparak bunları giderebilirsiniz:

  • .NET Framework 4.6.2'ye yükseltin. .NET Framework 4.6.2 ile birlikte gelen yeni 64 bit derleyici, bu bilinen sorunların her birini giderir.

  • Windows Update'i çalıştırarak Windows sürümünüzün güncel olduğundan emin olun. .NET Framework 4.6 ve 4.6.1'e yönelik hizmet güncelleştirmeleri, kutu kaldırma işlemi dışında NullReferenceException bu sorunların her birini giderir.

  • Eski 64 bit JIT derleyicisi ile derleyin. Bunun nasıl yapacağı hakkında daha fazla bilgi için diğer sorunların azaltılması bölümüne bakın.

Diğer sorunların azaltılması

Eski 64 bit derleyici ile derlenen kod ile yeni 64 bit JIT derleyicisi arasında veya uygulamanızın her ikisi de yeni 64 bit JIT derleyicisiyle derlenmiş hata ayıklama ve sürüm sürümleri arasında başka bir davranış farkıyla karşılaşırsanız, uygulamanızı eski 64 bit JIT derleyicisiyle derlemek için aşağıdakileri yapabilirsiniz:

  • Uygulama başına temelinde, uygulamanızın <yapılandırma dosyasına useLegacyJit> öğesini ekleyebilirsiniz. Aşağıdakiler, yeni 64 bit JIT derleyicisi ile derlemeyi devre dışı bırakır ve bunun yerine eski 64 bit JIT derleyicisini kullanır.

    <?xml version ="1.0"?>  
    <configuration>  
        <runtime>  
           <useLegacyJit enabled="1" />  
        </runtime>  
    </configuration>  
    
  • Kullanıcı başına temelinde, kayıt defterinin HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework anahtarına adlı useLegacyJit bir REG_DWORD değer ekleyebilirsiniz. 1 değeri eski 64 bit JIT derleyicisini etkinleştirir; 0 değeri bunu devre dışı bırakır ve yeni 64 bit JIT derleyicisini etkinleştirir.

  • Makine başına temelinde, kayıt defterinin HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework anahtarına adlı useLegacyJit bir REG_DWORD değer ekleyebilirsiniz. 1 değeri eski 64 bit JIT derleyicisini etkinleştirir; 0 değeri bunu devre dışı bırakır ve yeni 64 bit JIT derleyicisini etkinleştirir.

Microsoft Bağlan'da bir hata bildirerek de sorunu bize bildirebilirsiniz.

Ayrıca bkz.