.NET Framework 4.6.x'e geçiş için değişiklikleri yeniden hedefleme

Bu makalede .NET Framework 4.6, 4.6.1 ve 4.6.2'de sunulan uygulama uyumluluğu sorunları listelenmektedir.

.NET Framework 4.6

ASP.NET

HtmlTextWriter öğeyi doğru işlenmiyor <br/>

Ayrıntılar

.NET Framework 4.6'da başlayarak ve öğesiyle çağrısı RenderBeginTag(String) RenderEndTag() doğru bir <BR /> şekilde yalnızca bir ( <BR /> iki yerine) ekler

Öneri

Bir uygulama ek <BR /> etikete bağlıysa, RenderBeginTag(String) ikinci kez çağrılmalıdır. Bu davranış değişikliğinin yalnızca .NET Framework 4.6 veya üstünü hedefleyen uygulamaları etkilediğine dikkat edin, bu nedenle başka bir seçenek de eski davranışı elde etmek için .NET Framework'ün önceki bir sürümünü hedeflemektir.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

ClickOnce

ClickOnce ile yayımlanan ve SHA-256 kod imzalama sertifikası kullanan uygulamalar Windows 2003'te başarısız olabilir

Ayrıntılar

Yürütülebilir dosya SHA256 ile imzalanır. Daha önce, kod imzalama sertifikasının SHA-1 mi yoksa SHA-256 mı olduğuna bakılmaksızın SHA1 ile imzalandı. Bu, şunlar için geçerlidir:

  • Visual Studio 2012 veya üzeri ile oluşturulan tüm uygulamalar.
  • .NET Framework 4.5'e sahip sistemlerde Visual Studio 2010 veya önceki sürümleriyle oluşturulmuş uygulamalar. Ayrıca, .NET Framework 4.5 veya üzeri varsa, ClickOnce bildirimi, derlendiği .NET Framework sürümünden bağımsız olarak SHA-256 sertifikaları için SHA-256 ile de imzalanır.

Öneri

ClickOnce yürütülebilir dosyasını imzalama değişikliği yalnızca Windows Server 2003 sistemlerini etkiler; KB 938397 yüklenmesini gerektirir. Bir uygulama .NET Framework 4.0 veya önceki sürümleri hedeflese bile bildirimi SHA-256 ile imzalamada yapılan değişiklik, .NET Framework 4.5 veya sonraki bir sürüme çalışma zamanı bağımlılığı sağlar.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4,5
Tür Yeniden Hedefleme

ClickOnce, 4.0 hedefli uygulamalarda SHA-256'yi destekler

Ayrıntılar

Daha önce, SHA-256 ile imzalanmış sertifikaya sahip bir ClickOnce uygulaması, 4.0'ı hedeflese bile .NET Framework 4.5 veya sonraki bir sürümün mevcut olmasını gerektiriyordu. Artık SHA-256 ile imzalanmış olsa bile .NET Framework 4.0 hedefli ClickOnce uygulamaları .NET Framework 4.0 üzerinde çalıştırılabilir.

Öneri

Bu değişiklik bu bağımlılığı kaldırır ve .NET Framework 4 ve önceki sürümleri hedefleyen ClickOnce uygulamalarını imzalamak için SHA-256 sertifikalarının kullanılmasına izin verir.

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

Temel

Görevler arasında CurrentCulture ve CurrentUICulture akışı

Ayrıntılar

.NET Framework 4.6'da System.Globalization.CultureInfo.CurrentCulture başlayarak ve System.Globalization.CultureInfo.CurrentUICulture zaman uyumsuz işlemler arasında akan iş parçacığının System.Threading.ExecutionContextiçinde depolanır. Bu, veya System.Globalization.CultureInfo.CurrentUICulture üzerinde yapılan değişikliklerin System.Globalization.CultureInfo.CurrentCulture daha sonra zaman uyumsuz olarak çalıştırılacak görevlere yansıtılacağı anlamına gelir. Bu, önceki .NET Framework sürümlerinin davranışından farklıdır (sıfırlanır System.Globalization.CultureInfo.CurrentCulture ve System.Globalization.CultureInfo.CurrentUICulture tüm zaman uyumsuz görevlerde).

Öneri

Bu değişiklikten etkilenen uygulamalar, isteneni System.Globalization.CultureInfo.CurrentCulture açıkça veya System.Globalization.CultureInfo.CurrentUICulture zaman uyumsuz bir Görevde ilk işlem olarak ayarlayarak bu sorunu çözebilir. Alternatif olarak, aşağıdaki uyumluluk anahtarı ayarlanarak eski davranış (akmıyor System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) kabul edilebilir:

AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);

Bu sorun.NET Framework 4.6.2'de WPF tarafından düzeltilmiştir. Kb 3139549 aracılığıyla .NET Frameworks 4.6, 4.6.1'de de düzeltilmiştir. .NET Framework 4.6 veya üzerini hedefleyen uygulamalar WPF uygulamalarında doğru davranışı otomatik olarak alır - System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) Dispatcher işlemlerinde korunur.

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

ETW olay adları yalnızca "Başlat" veya "Durdur" soneki ile farklılık gösteremez

Ayrıntılar

.NET Framework 4.6 ve 4.6.1'de, windows için iki Olay İzleme (ETW) olay adı yalnızca bir "Başlat" veya "Durdur" sonekiyle farklılık gösterdiğinde çalışma zamanı bir ArgumentException oluşturur (bir olay adlandırılmışken diğeri adlandırılmışsa LogUser LogUserStart). Bu durumda, çalışma zamanı herhangi bir günlük yayamayan olay kaynağını oluşturulamaz.

Öneri

Özel durumu önlemek için, iki olay adının yalnızca "Başlat" veya "Durdur" soneki ile farklılık göstermediğinden emin olun. Bu gereksinim .NET Framework 4.6.2'den başlayarak kaldırılır; çalışma zamanı, yalnızca "Başlat" ve "Durdur" soneki ile farklılık gösteren olay adlarını birbirinden ayırabilir.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6
Tür Yeniden Hedefleme

Entity Framework

Visual Studio 2013 ile bir Entity Framework edmx oluşturma işlemi, EntityDeploySplit veya EntityClean görevleri kullanılıyorsa MSB4062 hatasıyla başarısız olabilir

Ayrıntılar

MSBuild 12.0 araçlarındaki (Visual Studio 2013’e dahildir) MSBuild dosya konumları değiştirilmiş ve eski Entity Framework hedef dosyalarının geçersiz olmasına neden olmuştur. Sonuç olarak, EntityDeploySplit ve EntityClean görevleri Microsoft.Data.Entity.Build.Tasks.dll dosyasını bulamadıkları için başarısız olur. Bu kesintinin bir .NET Framework değişikliğinden değil bir araç takımı (MSBuild/VS) değişikliğinden kaynaklandığına dikkat edin. .NET Framework’ü yükseltirken değil, yalnızca geliştirici araçlarını yükseltirken oluşur.

Öneri

Entity Framework hedef dosyaları, .NET Framework 4.6 sürümünden başlayarak yeni MSBuild düzeniyle çalışmak için düzeltildi. Bu Framework sürümüne yükseltmek bu sorunu çözecektir. Alternatif olarak, hedef dosyalarına doğrudan düzeltme eki uygulamak için bu geçici çözümü kullanabilirsiniz.

Veri Akışı Adı Değer
Kapsam Ana
Sürüm 4.5.1
Tür Yeniden Hedefleme

JIT

Bir deneme bölgesinde IL ret'e izin verilmiyor

Ayrıntılar

JIT64 tam zamanında derleyicisinin aksine, RyuJIT (.NET Framework 4.6'da kullanılır) bir deneme bölgesinde IL ret yönergesine izin vermez. Bir deneme bölgesinden döndürülmesine ECMA-335 belirtimi tarafından izin verilmez ve bilinen hiçbir yönetilen derleyici böyle bir IL oluşturmaz. Ancak, yansıma yayma kullanılarak oluşturulursa JIT64 derleyicisi böyle bir IL yürütür.

Öneri

Bir uygulama deneme bölgesinde ret opcode içeren bir IL oluşturuyorsa, uygulama eski JIT'yi kullanmak ve bu kesmeyi önlemek için .NET Framework 4.5'i hedef alabilir. Alternatif olarak, oluşturulan IL deneme bölgesinden sonra döndürülecek şekilde güncelleştirilebilir.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6
Tür Yeniden Hedefleme

.NET Framework 4.6'da yeni 64 bit JIT derleyicisi

Ayrıntılar

.NET Framework 4.6'dan başlayarak, tam zamanında derleme için yeni bir 64 bit JIT derleyicisi kullanılır. Bazı durumlarda beklenmeyen bir özel durum oluşur veya bir uygulamanın 32 bit derleyici veya eski 64 bit JIT derleyicisi kullanılarak çalıştırıldığından farklı bir davranış gözlemlenir. Bu değişiklik 32 bit JIT derleyicisini etkilemez. Bilinen farklar şunlardır:

  • 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 olarak değil 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 if try 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 if catch içindeki kod koşulsuz olarak yürütülür.

Öneri

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, öğesini uygulamanızın < yapılandırma dosyasına 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. değeri 1 eski 64 bit JIT derleyicisini etkinleştirir; değeri 0 bunu devre dışı bırakır ve yeni 64 bit JIT derleyicisini etkinleştirir. Microsoft Connect'te bir hata bildirerek de sorunu bize bildirebilirsiniz.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6
Tür Yeniden Hedefleme

Sertifika EKU OID doğrulaması

Ayrıntılar

.NET Framework 4.6'dan başlayarak veya SslStream ServicePointManager sınıfları gelişmiş anahtar kullanımı (EKU) nesne tanımlayıcısı (OID) doğrulaması gerçekleştirir. Gelişmiş anahtar kullanımı (EKU) uzantısı, anahtarı kullanan uygulamaları gösteren nesne tanımlayıcıları (OID) koleksiyonudur. EKU OID doğrulaması, uzak sertifikanın hedeflenen amaç için doğru OID'lere sahip olduğundan emin olmak için uzak sertifika geri çağırmalarını kullanır.

Öneri

Bu değişiklik istenmeyen bir durumsa, uygulama yapılandırma dosyanızdaki AppContextSwitchOverrides öğesine aşağıdaki anahtarı <ekleyerek sertifika EKU OID doğrulamasını ` devre dışı bırakabilirsiniz:>

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontCheckCertificateEKUs=true" />
</runtime>

Önemli

Bu ayar yalnızca geriye dönük uyumluluk için sağlanır. Aksi takdirde kullanılması önerilmez.

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

Yalnızca System.Net.ServicePointManager ve System.Net.Security.SslStream içinde desteklenen Tls 1.0, 1.1 ve 1.2 protokolleri

Ayrıntılar

.NET Framework 4.6'dan ServicePointManager başlayarak ve SslStream sınıflarının şu üç protokolden yalnızca birini kullanmasına izin verilir: Tls1.0, Tls1.1 veya Tls1.2. SSL3.0 protokolü ve RC4 şifrelemesi desteklenmez.

Öneri

Önerilen azaltma, sunucu tarafı uygulamasını Tls1.0, Tls1.1 veya Tls1.2'ye yükseltmektir. Bu uygun değilse veya istemci uygulamaları bozuksa, System.AppContext sınıfı bu özelliği iki yoldan biriyle geri çevirmek için kullanılabilir:

  • Burada açıklandığı gibi program aracılığıyla üzerinde System.AppContextuyumluluk anahtarlarını ayarlayarak.
  • app.config dosyasının <runtime> bölümüne aşağıdaki satırı ekleyerek:
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>
Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

TLS 1.x varsayılan olarak SCH_SEND_AUX_RECORD bayrağını temel SCHANNEL API'sine geçirir

Ayrıntılar

TLS 1.x kullanırken .NET Framework, temel alınan Windows SCHANNEL API'sine dayanır. .NET Framework 4.6'dan başlayarak, SCH_SEND_AUX_RECORD bayrağı varsayılan olarak SCHANNEL'e geçirilir. Bu, SCHANNEL'in verileri iki ayrı kayda (ilki tek bayt, ikincisi n-1 bayt olarak) şifrelemesine neden olur. Nadir durumlarda, bu, verilerin tek bir kayıtta bulunduğu varsayımında bulunan istemciler ve mevcut sunucular arasındaki iletişimi keser.

Öneri

Bu değişiklik mevcut bir sunucuyla iletişimi keserse, uygulama yapılandırma dosyanızın bölümündeki öğesine <runtime> aşağıdaki anahtarı ekleyerek SCH_SEND_AUX_RECORD bayrağı göndermeyi devre dışı bırakabilir ve verileri ayrı kayıtlara bölmeme <AppContextSwitchOverrides> davranışını geri yükleyebilirsiniz:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchSendAuxRecord=true" />
</runtime>

Önemli

Bu ayar yalnızca geriye dönük uyumluluk için sağlanır. Aksi takdirde kullanılması önerilmez.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

Windows Communication Foundation (WCF)

Null bağımsız değişkenle CreateDefaultAuthorizationContext çağrısı değiştirildi

Ayrıntılar

System.IdentityModel.Policy.AuthorizationContext çağrısı tarafından System.IdentityModel.Policy.AuthorizationContext.CreateDefaultAuthorizationContext(IList<IAuthorizationPolicy>) null authorizationPolicies bağımsız değişkeniyle döndürülen uygulamasının uygulaması ,NET Framework 4.6'da uygulamasını değiştirdi.

Öneri

Nadir durumlarda, özel kimlik doğrulaması kullanan WCF uygulamaları davranış farklılıkları görebilir. Bu gibi durumlarda, önceki davranış iki yoldan biriyle geri yüklenebilir:

  • Uygulamanızı .NET Framework'ün 4.6'dan önceki bir sürümünü hedeflemek için yeniden derle. IIS tarafından barındırılan <httpRuntime targetFramework="x.x"> hizmetler için öğesini kullanarak .NET Framework'ün önceki bir sürümünü hedefle.

  • app.config dosyanızın bölümüne aşağıdaki satırı <appSettings> ekleyin:

    <add key="appContext.SetSwitch:Switch.System.IdentityModel.EnableCachedEmptyDefaultAuthorizationContext" value="true" />
    
Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

Windows Forms

Icon.ToBitmap, PNG çerçeveleri olan simgeleri başarıyla Bit Eşlem nesnelerine dönüştürür

Ayrıntılar

.NET Framework 4.6'yı hedefleyen uygulamalardan Icon.ToBitmap başlayarak yöntem, PNG çerçeveleri olan simgeleri başarıyla Bit Eşlem nesnelerine dönüştürür.

.NET Framework 4.5.2 ve önceki sürümleri hedefleyen uygulamalarda, Icon nesnesinde Icon.ToBitmap PNG çerçeveleri varsa yöntem bir ArgumentOutOfRangeException özel durum oluşturur.

Bu değişiklik, .NET Framework 4.6'ya yönelik olarak yeniden derlenen ve bir Icon nesnesinin PNG çerçeveleri olduğunda atılan için ArgumentOutOfRangeException özel işleme uygulayan uygulamaları etkiler. .NET Framework 4.6 altında çalışırken dönüştürme başarılı olur, artık bir ArgumentOutOfRangeException atılır ve bu nedenle özel durum işleyicisi artık çağrılmaz.

Öneri

Bu davranış istenmeyen bir davranışsa, app.config dosyanızın bölümüne aşağıdaki öğeyi <runtime> ekleyerek önceki davranışı koruyabilirsiniz:

<AppContextSwitchOverrides
value="Switch.System.Drawing.DontSupportPngFramesInIcons=true" />

app.config dosyası zaten öğesini içeriyorsa AppContextSwitchOverrides , yeni değer aşağıdaki gibi değer özniteliğiyle birleştirilmelidir:

<AppContextSwitchOverrides
value="Switch.System.Drawing.DontSupportPngFramesInIcons=true;<previous key>=<previous value>" />
Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

Windows Presentation Foundation (WPF)

CurrentCulture, WPF Dağıtıcı işlemleri arasında korunmaz

Ayrıntılar

.NET Framework 4.6 sürümünden başlayarak, içinde yapılan veya System.Globalization.CultureInfo.CurrentUICulture yapılan System.Windows.Threading.Dispatcher değişiklikler System.Globalization.CultureInfo.CurrentCulture bu dağıtıcı işleminin sonunda kaybolur. Benzer şekilde, bir Dispatcher işleminde yapılan veya System.Globalization.CultureInfo.CurrentUICulture dışında yapılan değişikliklerSystem.Globalization.CultureInfo.CurrentCulture, bu işlem yürütürken yansıtılamayabilir. Pratikte bu, ve System.Globalization.CultureInfo.CurrentUICulture değişikliklerinin System.Globalization.CultureInfo.CurrentCulture WPF ui geri çağırmaları ile WPF uygulamasındaki diğer kodlar arasında akmayabileceği anlamına gelir. Bunun nedeni, .NET Framework 4.6'yi hedefleyen uygulamalardan başlayarak yürütme bağlamında depolanmasına neden System.Globalization.CultureInfo.CurrentCulture olan ve System.Globalization.CultureInfo.CurrentUICulture bu bağlamda depolanacak bir değişikliktirSystem.Threading.ExecutionContext. WPF dağıtıcı işlemleri, işlemi başlatmak ve işlem tamamlandığında önceki bağlamı geri yüklemek için kullanılan yürütme bağlamını depolar. ve System.Globalization.CultureInfo.CurrentUICulture artık bu bağlamın bir parçası olduğundanSystem.Globalization.CultureInfo.CurrentCulture, dağıtıcı işlemi içinde bu değişiklikler işlemin dışında kalıcı olmaz.

Öneri

Bu değişiklikten etkilenen uygulamalar, isteneni System.Globalization.CultureInfo.CurrentCulture depolayarak veya System.Globalization.CultureInfo.CurrentUICulture bir alanda depolayarak ve doğru ve System.Globalization.CultureInfo.CurrentUICulture ayarlanmış olan tüm Dispatcher işlem gövdelerini (UI olay geri çağırma işleyicileri dahil) System.Globalization.CultureInfo.CurrentCulture denetleyerek bu sorunu çözebilir. Alternatif olarak, bu WPF değişikliğinin temel aldığı ExecutionContext değişikliği yalnızca .NET Framework 4.6 veya üzerini hedefleyen uygulamaları etkilediğinden, .NET Framework 4.5.2'yi hedefleyerek bu kesme önlenebilir. .NET Framework 4.6 veya üstünü hedefleyen uygulamalar da aşağıdaki uyumluluk anahtarını ayarlayarak bu sorunu geçici olarak çözebilir:

AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);

Bu sorun.NET Framework 4.6.2'de WPF tarafından düzeltilmiştir. Kb 3139549 aracılığıyla .NET Frameworks 4.6, 4.6.1'de de düzeltilmiştir. .NET Framework 4.6 veya üzerini hedefleyen uygulamalar WPF uygulamalarında doğru davranışı otomatik olarak alır - System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) Dispatcher işlemlerinde korunur.

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

Kenar boşluklarının WPF düzeni yuvarlama değişti

Ayrıntılar

Kenar boşluklarının yuvarlanma ve kenarlıklar ile içindeki arka plan değişti. Bu değişikliğin sonucu olarak:

  • Öğelerin genişliği veya yüksekliği en fazla bir piksel büyüyebilir veya küçülebilir.
  • Bir nesnenin yerleşimi en fazla bir piksel hareket edebilir.
  • Ortalanmış öğeler dikey veya yatay olarak en fazla bir piksel ortalanabilir. Varsayılan olarak, bu yeni düzen yalnızca .NET Framework 4.6'yı hedefleyen uygulamalar için etkinleştirilir.

Öneri

Bu değişiklik yüksek DPI'lerdeki WPF denetimlerinin sağ veya alt kısım kırpmasını ortadan kaldırma eğiliminde olduğundan, .NET Framework'ün önceki sürümlerini hedefleyen ancak .NET Framework 4.6 üzerinde çalışan uygulamalar, app.config dosyasının bölümüne aşağıdaki satırı <runtime> ekleyerek bu yeni davranışı kabul edebilir:

<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=false" />

.NET Framework 4.6'yi hedefleyen ancak WPF denetimlerinin önceki düzen algoritmasını kullanarak işlenmesini isteyen uygulamalar, app.config dosyasının bölümüne aşağıdaki satırı <runtime> ekleyerek bunu yapabilir:

<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=true" />
Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

XML, XSLT

XmlWriter geçersiz vekil çiftler üzerine atar

Ayrıntılar

.NET Framework 4.5.2 veya önceki sürümleri hedefleyen uygulamalar için, özel durum geri dönüş işlemesini kullanarak geçersiz bir vekil çift yazmak her zaman bir özel durum oluşturmaz. .NET Framework 4.6'yı hedefleyen uygulamalar için geçersiz bir vekil çift yazmaya çalışmak bir System.ArgumentExceptionoluşturur.

Öneri

Gerekirse, .NET Framework 4.5.2 veya önceki sürümleri hedeflenerek bu kesme önlenebilir. Alternatif olarak, geçersiz vekil çiftler yazmadan önce geçerli xml'de önceden işlenebilir.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

Bileşik anahtarlar kullanılırsa ve bir anahtar boşsa XSD Şema doğrulaması artık benzersiz kısıtlamaların ihlallerini doğru algılar

Ayrıntılar

.NET Framework'ün 4.6 öncesi sürümlerinde, anahtarlardan biri boşsa XSD doğrulamasının bileşik anahtarlardaki benzersiz kısıtlamaları algılamamasına neden olan bir hata vardı. .NET Framework 4.6'da bu sorun düzeltildi. Bu, daha doğru doğrulamaya neden olur, ancak daha önce sahip olacağı bir XML'nin doğrulanmamasıyla da sonuçlanabilir.

Öneri

Daha gevşek .NET Framework 4.0 doğrulaması gerekiyorsa, doğrulayan uygulama .NET Framework'ün 4.5 (veya önceki) sürümünü hedefleyebilir. Ancak .NET Framework 4.6'ya yeniden hedeflenirken yinelenen bileşik anahtarların (bu sorunun açıklamasında açıklandığı gibi) doğrulanmadığından emin olmak için kod incelemesi yapılmalıdır.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6
Tür Yeniden Hedefleme

.NET Framework 4.6.1

Temel

ZipArchiveEntry nesnelerinin FullName özelliğinde yol ayırıcı karakterini değiştirme

Ayrıntılar

.NET Framework 4.6.1 ve sonraki sürümlerini hedefleyen uygulamalar için yol ayırıcı karakteri, yöntemin aşırı yüklemeleri CreateFromDirectory tarafından oluşturulan nesnelerin özelliğinde FullName ZipArchiveEntry ters eğik çizgi ("\") yerine eğik çizgi ("/") olarak değiştirildi. Değişiklik, .NET uygulamasını .ZIP Dosya Biçimi Belirtimi'nin 4.4.17.1 bölümüne uygun olarak getirir ve windows olmayan sistemlerde .ZIP arşivlerinin sıkıştırmasını kaldırmaya olanak tanır.
Macintosh gibi Windows dışı işletim sistemlerinde .NET Framework'ün önceki bir sürümünü hedefleyen bir uygulama tarafından oluşturulan zip dosyasının sıkıştırmasını açmak dizin yapısını koruyamıyor. Örneğin Macintosh'ta, dosya adı dizin yolunu, tüm ters eğik çizgi ("\") karakterleri ve dosya adını birleştirir. Sonuç olarak, sıkıştırılmış dosyaların dizin yapısı korunmaz.

Öneri

Bu API'ler yol ayırıcı karakteri olarak eğik çizgi ("/") veya ters eğik çizgi ("\") sorunsuz bir şekilde işleyebildiğinden, bu değişikliğin Windows işletim sisteminde .NET Framework System.IO ad alanında API'ler tarafından sıkıştırılmış .ZIP dosyalar üzerindeki etkisi en az düzeyde olmalıdır.
Bu değişiklik istenmeyen bir durumsa, uygulama yapılandırma dosyanızın bölümüne bir yapılandırma ayarı ekleyerek bu değişikliği <runtime> geri çevirebilirsiniz. Aşağıdaki örnekte hem bölümü hem Switch.System.IO.Compression.ZipFile.UseBackslash de <runtime> geri çevirme anahtarı gösterilmektedir:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=true" />
</runtime>

Ayrıca, .NET Framework'ün önceki sürümlerini hedefleyen ancak .NET Framework 4.6.1 ve sonraki sürümlerinde çalışan uygulamalar, uygulama yapılandırma dosyasının bölümüne bir yapılandırma ayarı <runtime> ekleyerek bu davranışı kabul edebilir. Aşağıda hem bölümü hem Switch.System.IO.Compression.ZipFile.UseBackslash de <runtime> kabul etme anahtarı gösterilmektedir.

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=false" />
</runtime>
Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.1
Tür Yeniden Hedefleme

Etkilenen API’ler

Windows Communication Foundation (WCF)

TransportWithMessageCredential güvenlik modu ile WCF bağlaması

Ayrıntılar

.NET Framework 4.6.1'den başlayarak, TransportWithMessageCredential güvenlik modunu kullanan WCF bağlaması, asimetrik güvenlik anahtarları için imzasız "hedef" üst bilgilerine sahip iletileri alacak şekilde ayarlanabilir. Varsayılan olarak, .NET Framework 4.6.1'de imzalanmamış "hedef" üst bilgiler reddedilmeye devam eder. Bunlar yalnızca bir uygulama Switch.System.ServiceModel.AllowUnsignedToHeader yapılandırma anahtarını kullanarak bu yeni işlem modunu kabul ederse kabul edilir.

Öneri

Bu bir kabul etme özelliği olduğundan, mevcut uygulamaların davranışını etkilememelidir.
Yeni davranışın kullanılıp kullanılmayacağını denetlemek için aşağıdaki yapılandırma ayarını kullanın:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.ServiceModel.AllowUnsignedToHeader=true" />
</runtime>
Veri Akışı Adı Değer
Kapsam Saydam
Sürüm 4.6.1
Tür Yeniden Hedefleme

Etkilenen API’ler

X509CertificateClaimSet.FindClaims Tüm claimType'ları Dikkate Alır

Ayrıntılar

.NET Framework 4.6.1'i hedefleyen uygulamalarda, BIR X509 talep kümesi SAN alanında birden çok DNS girdisi olan bir sertifikadan başlatılırsa, System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(String, String) yöntem claimType bağımsız değişkenini tüm DNS girdileriyle eşleştirmeyi dener. .NET Framework'ün önceki sürümlerini hedefleyen uygulamalar için yöntemi, System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(String, String) claimType bağımsız değişkenini yalnızca son DNS girişiyle eşleştirmeyi dener.

Öneri

Bu değişiklik yalnızca .NET Framework 4.6.1'i hedefleyen uygulamaları etkiler. Bu değişiklik DisableMultipleDNSEntries uyumluluk anahtarıyla devre dışı bırakılabilir (veya 4.6.1 öncesi hedefleniyorsa etkinleştirilebilir).

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6.1
Tür Yeniden Hedefleme

Etkilenen API’ler

Windows Forms

Application.FilterMessage artık IMessageFilter.PreFilterMessage'ın yeniden katılımcı uygulamaları için oluşturmaz

Ayrıntılar

.NET Framework 4.6.1'den önce ile çağrılması FilterMessage(Message) PreFilterMessage(Message) System.Windows.Forms.Application.AddMessageFilter(IMessageFilter) veya System.Windows.Forms.Application.RemoveMessageFilter(IMessageFilter) (aynı zamanda çağrılırken DoEvents()) bir System.IndexOutOfRangeExceptionöğesine neden olabilir.

.NET Framework 4.6.1'i hedefleyen uygulamalardan başlayarak, bu özel durum artık atılamaz ve yukarıda açıklandığı gibi yeniden katılımcı filtreleri kullanılabilir.

Öneri

Yukarıda açıklanan yeniden katılımcı PreFilterMessage(Message) davranışı için artık oluşturmayacağını unutmayınFilterMessage(Message). Bu yalnızca .NET Framework 4.6.1'i hedefleyen uygulamaları etkiler .NET Framework 4.6.1'i hedefleyen uygulamalar DontSupportReentrantFilterMessage uyumluluk anahtarını kullanarak bu değişikliği geri çevirebilir (veya eski Çerçeveleri hedefleyen uygulamalar kabul edebilir).

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.1
Tür Yeniden Hedefleme

Etkilenen API’ler

Windows Presentation Foundation (WPF)

Dokunmatik özellikli sistemlerde System.Windows.Input.PenContext.Disable çağrısı bir ArgumentException oluşturabilir

Ayrıntılar

Bazı durumlarda, dokunmatik özellikli sistemlerde iç System.Windows.Intput.PenContext.Disable yöntemine yapılan çağrılar yeniden giriş nedeniyle işlenmeyen T:System.ArgumentException bir duruma neden olabilir.

Öneri

Bu sorun .NET Framework 4.7'de giderilmiştir. Özel durumu önlemek için .NET Framework 4.7 ile başlayan bir .NET Framework sürümüne yükseltin.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.1
Tür Yeniden Hedefleme

.NET Framework 4.6.2

ASP.NET

HttpRuntime.AppDomainAppPath NullReferenceException Oluşturur

Ayrıntılar

.NET Framework 4.6.2'de, boş karakterler içeren bir değer alınırken çalışma zamanı bir T:System.NullReferenceException P:System.Web.HttpRuntime.AppDomainAppPath oluşturur. .NET Framework 4.6.1 ve önceki sürümlerinde çalışma zamanı bir T:System.ArgumentNullExceptionoluşturur.

Öneri

Bu değişikliğe yanıt vermek için aşağıdakilerden birini yapabilirsiniz:

  • Uygulamanızın T:System.NullReferenceException .NET Framework 4.6.2 üzerinde çalışıyorsa öğesini işleyin.
  • Önceki davranışı geri yükleyen ve bir T:System.ArgumentNullExceptionoluşturan .NET Framework 4.7'ye yükseltin.
Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

Temel

AesCryptoServiceProvider decryptor yeniden kullanılabilir bir dönüşüm sağlar

Ayrıntılar

.NET Framework 4.6.2'yi hedefleyen uygulamalardan AesCryptoServiceProvider başlayarak şifre çözücü yeniden kullanılabilir bir dönüşüm sağlar. çağrısından System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32)sonra dönüşüm yeniden başlatılabilir ve yeniden kullanılabilir. .NET Framework'ün önceki sürümlerini hedefleyen uygulamalar için, bir çağrıdan System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32) CryptographicException sonra çağırarak System.Security.Cryptography.CryptoAPITransform.TransformBlock(Byte[], Int32, Int32, Byte[], Int32) şifre çözücüsünün yeniden kullanılması veya bozuk veriler üretmesi.

Öneri

Beklenen davranış bu olduğundan, bu değişikliğin etkisi en düşük düzeyde olmalıdır. Önceki davranışa bağlı olan uygulamalar, uygulamanın yapılandırma dosyasının bölümüne aşağıdaki yapılandırma ayarını <runtime> ekleyerek bunu kullanmayı geri çevirebilir:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.AesCryptoServiceProvider.DontCorrectlyResetDecryptor=true"/>
</runtime>

Ayrıca, .NET Framework'ün önceki bir sürümünü hedefleyen ancak .NET Framework 4.6.2 ile başlayan bir .NET Framework sürümü altında çalışan uygulamalar, uygulamanın yapılandırma dosyasının bölümüne aşağıdaki yapılandırma ayarını <runtime> ekleyerek bunu kabul edebilir:

<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.AesCryptoServiceProvider.DontCorrectlyResetDecryptor=false"/>
</runtime>
Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

ClaimsIdentity oluşturucularına çağrılar

Ayrıntılar

.NET Framework 4.6.2'den başlayarak, bir parametreye sahip oluşturucuların özelliğini ayarlama yönteminde ClaimsIdentity System.Security.Claims.ClaimsIdentity.Actor bir System.Security.Principal.IIdentity değişiklik vardır. System.Security.Principal.IIdentity Bağımsız değişken bir ClaimsIdentity nesneyse ve System.Security.Claims.ClaimsIdentity.Actor bu ClaimsIdentity nesnenin özelliği değilsenullSystem.Security.Claims.ClaimsIdentity.Actor, özelliği yöntemi kullanılarak Clone() eklenir. Framework 4.6.1 ve önceki sürümlerinde, System.Security.Claims.ClaimsIdentity.Actor özellik mevcut bir başvuru olarak eklenir. Bu değişiklik nedeniyle, .NET Framework 4.6.2'den başlayarak, System.Security.Claims.ClaimsIdentity.Actor yeni ClaimsIdentity nesnenin özelliği oluşturucunun System.Security.Principal.IIdentity bağımsız değişkeninin özelliğine System.Security.Claims.ClaimsIdentity.Actor eşit değildir. .NET Framework 4.6.1 ve önceki sürümlerinde eşittir.

Öneri

Bu davranış istenmeyen bir davranışsa, uygulama yapılandırma dosyanızdaki trueanahtarı olarak ayarlayarak Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentity önceki davranışı geri yükleyebilirsiniz. Bunun için web.config dosyanızın bölümüne aşağıdakileri <runtime> eklemeniz gerekir:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentity=true" />
  </runtime>
</configuration>
Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

Yol normalleştirmesindeki değişiklikler

Ayrıntılar

.NET Framework 4.6.2'yi hedefleyen uygulamalardan başlayarak, çalışma zamanının yolları normalleştirme yöntemi değişti. Yolu normalleştirmek, bir yolu veya dosyayı tanımlayan dizeyi, hedef işletim sistemindeki geçerli bir yola uyacak şekilde değiştirmeyi içerir. Normalleştirme genellikle şunları içerir:

  • Bileşen ve dizin ayırıcılarını kurallı hale getirme.
  • Geçerli dizini göreli bir yola uygulama.
  • Bir yoldaki göreli dizini (.) veya üst dizini (..) değerlendirme.
  • Belirtilen karakterler kırpılır. .NET Framework 4.6.2'yi hedefleyen uygulamalardan başlayarak, yol normalleştirmesinde aşağıdaki değişiklikler varsayılan olarak etkinleştirilir:
    • Çalışma zamanı, yolları normalleştirmek için işletim sisteminin GetFullPathName işlevine karşı çıkar.
  • Normalleştirme artık dizin kesimlerinin sonunu kırpmayı (dizin adının sonundaki boşluk gibi) içermez.
  • mscorlib.dll içindeki dosya G/Ç API'leri için ve dahil olmak üzere \\.\ tam güven içinde cihaz yolu söz dizimi desteği. \\?\
  • Çalışma zamanı, cihaz söz dizimi yollarını doğrulamaz.
  • Alternatif veri akışlarına erişmek için cihaz söz dizimi kullanımı desteklenir. Bu değişiklikler, yöntemlerin daha önce erişilemeyen yollara erişmesine izin verirken performansı artırır. .NET Framework 4.6.1 ve önceki sürümlerini hedefleyen ancak .NET Framework 4.6.2 veya üzeri altında çalışan uygulamalar bu değişiklikten etkilenmez.

Öneri

.NET Framework 4.6.2 veya üstünü hedefleyen uygulamalar bu değişikliği geri çevirebilir ve uygulama yapılandırma dosyasının bölümüne aşağıdakileri <runtime> ekleyerek eski normalleştirmeyi kullanabilir:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true" />
</runtime>

.NET Framework 4.6.1 veya önceki sürümleri hedefleyen ancak .NET Framework 4.6.2 veya sonraki sürümlerinde çalışan uygulamalar, uygulama .configuration dosyasının bölümüne aşağıdaki satırı <runtime> ekleyerek yol normalleştirmesinde yapılan değişiklikleri etkinleştirebilir:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>
Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6.2
Tür Yeniden Hedefleme

Görevler arasında CurrentCulture ve CurrentUICulture akışı

Ayrıntılar

.NET Framework 4.6'da System.Globalization.CultureInfo.CurrentCulture başlayarak ve System.Globalization.CultureInfo.CurrentUICulture zaman uyumsuz işlemler arasında akan iş parçacığının System.Threading.ExecutionContextiçinde depolanır. Bu, veya System.Globalization.CultureInfo.CurrentUICulture üzerinde yapılan değişikliklerin System.Globalization.CultureInfo.CurrentCulture daha sonra zaman uyumsuz olarak çalıştırılacak görevlere yansıtılacağı anlamına gelir. Bu, önceki .NET Framework sürümlerinin davranışından farklıdır (sıfırlanır System.Globalization.CultureInfo.CurrentCulture ve System.Globalization.CultureInfo.CurrentUICulture tüm zaman uyumsuz görevlerde).

Öneri

Bu değişiklikten etkilenen uygulamalar, isteneni System.Globalization.CultureInfo.CurrentCulture açıkça veya System.Globalization.CultureInfo.CurrentUICulture zaman uyumsuz bir Görevde ilk işlem olarak ayarlayarak bu sorunu çözebilir. Alternatif olarak, aşağıdaki uyumluluk anahtarı ayarlanarak eski davranış (akmıyor System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) kabul edilebilir:

AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);

Bu sorun.NET Framework 4.6.2'de WPF tarafından düzeltilmiştir. Kb 3139549 aracılığıyla .NET Frameworks 4.6, 4.6.1'de de düzeltilmiştir. .NET Framework 4.6 veya üzerini hedefleyen uygulamalar WPF uygulamalarında doğru davranışı otomatik olarak alır - System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) Dispatcher işlemlerinde korunur.

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme

Etkilenen API’ler

ETW olay adları yalnızca "Başlat" veya "Durdur" soneki ile farklılık gösteremez

Ayrıntılar

.NET Framework 4.6 ve 4.6.1'de, windows için iki Olay İzleme (ETW) olay adı yalnızca bir "Başlat" veya "Durdur" sonekiyle farklılık gösterdiğinde çalışma zamanı bir ArgumentException oluşturur (bir olay adlandırılmışken diğeri adlandırılmışsa LogUser LogUserStart). Bu durumda, çalışma zamanı herhangi bir günlük yayamayan olay kaynağını oluşturulamaz.

Öneri

Özel durumu önlemek için, iki olay adının yalnızca "Başlat" veya "Durdur" soneki ile farklılık göstermediğinden emin olun. Bu gereksinim .NET Framework 4.6.2'den başlayarak kaldırılır; çalışma zamanı, yalnızca "Başlat" ve "Durdur" soneki ile farklılık gösteren olay adlarını birbirinden ayırabilir.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6
Tür Yeniden Hedefleme

Uzun yol desteği

Ayrıntılar

.NET Framework 4.6.2'yi hedefleyen uygulamalardan başlayarak, uzun yollar (32K karaktere kadar) desteklenir ve yol uzunluklarıyla ilgili 260 karakterlik (veya MAX_PATH) sınırlaması kaldırılmıştır. .NET Framework 4.6.2'yi hedefleyecek şekilde yeniden derlenen uygulamalar için, yol 260 karakteri aştığı için daha önce yol System.IO.PathTooLongException oluşturan kod yolları artık aşağıdaki koşullarda yalnızca bir System.IO.PathTooLongException oluşturur:

  • Yolun uzunluğu (32.767) karakterden MaxValue büyük.
  • İşletim sistemi veya eşdeğerini döndürür COR_E_PATHTOOLONG . .NET Framework 4.6.1 ve önceki sürümleri hedefleyen uygulamalar için, bir yol 260 karakteri aştığında çalışma zamanı otomatik olarak bir System.IO.PathTooLongException oluşturur.

Öneri

.NET Framework 4.6.2'yi hedefleyen uygulamalar için, dosyanızın app.config bölümüne aşağıdakileri <runtime> ekleyerek uzun yol desteğini geri çevirebilirsiniz:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=true" />
</runtime>

.NET Framework'ün önceki sürümlerini hedefleyen ancak .NET Framework 4.6.2 veya sonraki sürümlerinde çalışan uygulamalar için, dosyanızın app.config bölümüne aşağıdakileri <runtime> ekleyerek uzun yol desteğini kabul edebilirsiniz:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=false" />
</runtime>
Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6.2
Tür Yeniden Hedefleme

Yol iki nokta üst üste denetimleri daha katı

Ayrıntılar

.NET Framework 4.6.2'de, daha önce desteklenmeyen yolları (hem uzunluk hem de biçimde) desteklemek için bir dizi değişiklik yapıldı. Doğru sürücü ayırıcı (iki nokta üst üste) söz dizimi denetimleri daha doğru yapılmıştır ve bu da daha önce tolere edildikleri birkaç seçim Yolu API'sinde bazı URI yollarını engellemenin yan etkisiydi.

Öneri

Etkilenen API'lere bir URI geçiriyorsanız, önce dizeyi yasal bir yol olacak şekilde değiştirin.

  • Düzeni URL'lerden el ile kaldırın (örneğin, URL'lerden kaldırın file:// ).

  • URI'yi sınıfına Uri geçirin ve kullanın LocalPath.

Alternatif olarak, AppContext anahtarını trueolarak ayarlayarak yeni yol normalleştirmesini Switch.System.IO.UseLegacyPathHandling geri çevirebilirsiniz.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

Güvenlik

RSACng artık standart olmayan anahtar boyutuna sahip RSA anahtarlarını doğru şekilde yükler

Ayrıntılar

4.6.2 öncesi .NET Framework sürümlerinde, RSA sertifikaları için standart olmayan anahtar boyutlarına sahip müşteriler ve System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2) uzantı yöntemleri aracılığıyla System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(X509Certificate2) bu anahtarlara erişemez. System.Security.Cryptography.CryptographicException"İstenen anahtar boyutu desteklenmiyor" iletisiyle bir oluşturulur. .NET Framework 4.6.2'de bu sorun düzeltildi. Benzer şekilde, ImportParameters(RSAParameters) ImportParameters(RSAParameters) şimdi de bir oluşturmadan System.Security.Cryptography.CryptographicExceptionstandart olmayan anahtar boyutlarıyla çalışın.

Öneri

Standart olmayan anahtar boyutları kullanıldığında a'nın System.Security.Cryptography.CryptographicException oluştuğu önceki davranışa dayanan bir özel durum işleme mantığı varsa, mantığı kaldırmayı göz önünde bulundurun.

Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

SignedXml.GetPublicKey, yeniden hedefleme değişikliği olmadan net462 (veya lightup) üzerinde RSACng döndürür

Ayrıntılar

.NET Framework 4.6.2'den başlayarak, yöntemi tarafından SignedXml.GetPublicKey döndürülen nesnenin somut türü CryptoServiceProvider uygulamasından Cng uygulamasına değiştirildi (ilginçlik olmadan). Bunun nedeni, uygulamanın ' certificate.PublicKey.Key den uygulamasına ileten iç certificate.GetAnyPublicKey öğesini kullanmaya değişmesidir RSACertificateExtensions.GetRSAPublicKey.

Öneri

.NET Framework 4.7.1 üzerinde çalışan uygulamalardan başlayarak, uygulama yapılandırma dosyanızın çalışma zamanı bölümüne aşağıdaki yapılandırma anahtarını ekleyerek .NET Framework 4.6.1 ve önceki sürümlerde varsayılan olarak kullanılan CryptoServiceProvider uygulamasını kullanabilirsiniz:

<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

Windows Communication Foundation (WCF)

Yeniden Giriş hizmetleri kullanılırken kilitlenme oluşabilir

Ayrıntılar

Kilitlenme, hizmetin örneklerini bir kerede bir yürütme iş parçacığıyla kısıtlayan Yeniden Giriş hizmetine neden olabilir. Bu sorunla karşılaşmaya eğilimli hizmetlerin kodunda aşağıdakiler ServiceBehaviorAttribute yer alır:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

Öneri

Bu sorunu gidermek için aşağıdakileri yapabilirsiniz:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
  • .NET Framework 4.6.2'ye en son güncelleştirmeyi yükleyin veya .NET Framework'ün sonraki bir sürümüne yükseltin. Bu, içindeki OperationContext.Currentakışını ExecutionContext devre dışı bırakır. Bu davranış yapılandırılabilir; yapılandırma dosyanıza aşağıdaki uygulama ayarını eklemeye eşdeğerdir:
<appSettings>
  <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="true" />
</appSettings>

Değeri Switch.System.ServiceModel.DisableOperationContextAsyncFlow hiçbir zaman Reentrant hizmetleri için olarak ayarlanmamalıdır false .

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

OperationContext.Current, using yan tümcesinde çağrıldığında null döndürebilir

Ayrıntılar

OperationContext.Current döndürebilir null ve NullReferenceException aşağıdaki koşulların tümü doğruysa sonuçlanabilir:

using (new OperationContextScope(OperationContext.Current))
{
    // OperationContext.Current is null.
    OperationContext context = OperationContext.Current;

    // ...
}

Öneri

Bu sorunu gidermek için aşağıdakileri yapabilirsiniz:

  • Yeni bir nesne olmayan null Current örneği oluşturmak için kodunuzu aşağıdaki gibi değiştirin:

    OperationContext ocx = OperationContext.Current;
    using (new OperationContextScope(OperationContext.Current))
    {
        OperationContext.Current = new OperationContext(ocx.Channel);
    
        // ...
    }
    
  • .NET Framework 4.6.2'ye en son güncelleştirmeyi yükleyin veya .NET Framework'ün sonraki bir sürümüne yükseltin. Bu, 'OperationContext.Currentnin ExecutionContext akışını devre dışı bırakır ve .NET Framework 4.6.1 ve önceki sürümlerde WCF uygulamalarının davranışını geri yükler. Bu davranış yapılandırılabilir; yapılandırma dosyanıza aşağıdaki uygulama ayarını eklemeye eşdeğerdir:

    <appSettings>
      <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="true" />
    </appSettings>
    

    Bu değişiklik istenmeyen bir durumsa ve uygulamanız işlem bağlamları arasında akan yürütme bağlamlarına bağlıysa, akışını aşağıdaki gibi etkinleştirebilirsiniz:

    <appSettings>
      <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="false" />
    </appSettings>
    
Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

WCF aktarım güvenliği CNG kullanılarak depolanan sertifikaları destekler

Ayrıntılar

.NET Framework 4.6.2'yi hedefleyen uygulamalardan başlayarak, WCF aktarım güvenliği Windows Şifreleme Kitaplığı (CNG) kullanılarak depolanan sertifikaları destekler. Bu destek, 32 bitten uzun olmayan bir üssü olan ortak anahtara sahip sertifikalarla sınırlıdır. Bir uygulama .NET Framework 4.6.2'yi hedeflediğinde, bu özellik varsayılan olarak açıktır. .NET Framework'ün önceki sürümlerinde, CSG anahtar depolama sağlayıcısı ile X509 sertifikalarını kullanma girişimi bir özel durum oluşturur.

Öneri

.NET Framework 4.6.1 ve önceki sürümleri hedefleyen ancak .NET Framework 4.6.2 üzerinde çalışan uygulamalar, app.config veya web.config dosyasının bölümüne aşağıdaki satırı <runtime> ekleyerek CNG sertifikaları için desteği etkinleştirebilir:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IdentityModel.DisableCngCertificates=false" />
</runtime>

Bu, aşağıdaki kodla program aracılığıyla da yapılabilir:

private const string DisableCngCertificates = @"Switch.System.IdentityModel.DisableCngCertificate";

AppContext.SetSwitch(disableCngCertificates, false);
Const DisableCngCertificates As String = "Switch.System.IdentityModel.DisableCngCertificates"
AppContext.SetSwitch(disableCngCertificates, False)

Bu değişiklik nedeniyle, başarısız olacak bir CNG sertifikasıyla güvenli iletişim başlatma girişimine bağlı özel durum işleme kodlarının artık yürütülmeyecek olduğunu unutmayın.

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6.2
Tür Yeniden Hedefleme

Windows Forms

MemberDescriptor.Equals dosyasının yanlış uygulanması

Ayrıntılar

yönteminin MemberDescriptor.Equals özgün uygulaması, karşılaştırılan nesnelerden iki farklı dize özelliğini karşılaştırır: kategori adı ve açıklama dizesi. Düzeltme, ilk nesnenin ikinci nesnenin Description ve birinci nesnenin Category Description ikincisininkiyle karşılaştırmaktırCategory.

Öneri

Uygulamanız bazen tanımlayıcılar MemberDescriptor.Equals eşdeğer olduğunda döndürülme false durumuna bağlıysa ve .NET Framework 4.6.2 veya sonraki bir sürümü hedeflediyseniz, birkaç seçeneğiniz vardır:

  • yöntemini çağırmaya Category MemberDescriptor.Equals ek olarak ve Description alanlarını el ile karşılaştırmak için kod değişiklikleri yapın.
  • app.config dosyasına aşağıdaki değeri ekleyerek bu değişikliği geri çevirme:
<runtime>
  <AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=true" />
</runtime>

Uygulamanız .NET Framework 4.6.1 veya önceki sürümleri hedeflediyse ve .NET Framework 4.6.2 veya sonraki sürümlerinde çalışıyorsa ve bu değişikliğin etkinleştirilmesini istiyorsanız, app.config dosyasına aşağıdaki değeri ekleyerek uyumluluk anahtarını false olarak ayarlayabilirsiniz:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=false" />
</runtime>
Veri Akışı Adı Değer
Kapsam Edge
Sürüm 4.6.2
Tür Yeniden Hedefleme

Etkilenen API’ler

Windows Presentation Foundation (WPF)

CurrentCulture, WPF Dağıtıcı işlemleri arasında korunmaz

Ayrıntılar

.NET Framework 4.6 sürümünden başlayarak, içinde yapılan veya System.Globalization.CultureInfo.CurrentUICulture yapılan System.Windows.Threading.Dispatcher değişiklikler System.Globalization.CultureInfo.CurrentCulture bu dağıtıcı işleminin sonunda kaybolur. Benzer şekilde, bir Dispatcher işleminde yapılan veya System.Globalization.CultureInfo.CurrentUICulture dışında yapılan değişikliklerSystem.Globalization.CultureInfo.CurrentCulture, bu işlem yürütürken yansıtılamayabilir. Pratikte bu, ve System.Globalization.CultureInfo.CurrentUICulture değişikliklerinin System.Globalization.CultureInfo.CurrentCulture WPF ui geri çağırmaları ile WPF uygulamasındaki diğer kodlar arasında akmayabileceği anlamına gelir. Bunun nedeni, .NET Framework 4.6'yi hedefleyen uygulamalardan başlayarak yürütme bağlamında depolanmasına neden System.Globalization.CultureInfo.CurrentCulture olan ve System.Globalization.CultureInfo.CurrentUICulture bu bağlamda depolanacak bir değişikliktirSystem.Threading.ExecutionContext. WPF dağıtıcı işlemleri, işlemi başlatmak ve işlem tamamlandığında önceki bağlamı geri yüklemek için kullanılan yürütme bağlamını depolar. ve System.Globalization.CultureInfo.CurrentUICulture artık bu bağlamın bir parçası olduğundanSystem.Globalization.CultureInfo.CurrentCulture, dağıtıcı işlemi içinde bu değişiklikler işlemin dışında kalıcı olmaz.

Öneri

Bu değişiklikten etkilenen uygulamalar, isteneni System.Globalization.CultureInfo.CurrentCulture depolayarak veya System.Globalization.CultureInfo.CurrentUICulture bir alanda depolayarak ve doğru ve System.Globalization.CultureInfo.CurrentUICulture ayarlanmış olan tüm Dispatcher işlem gövdelerini (UI olay geri çağırma işleyicileri dahil) System.Globalization.CultureInfo.CurrentCulture denetleyerek bu sorunu çözebilir. Alternatif olarak, bu WPF değişikliğinin temel aldığı ExecutionContext değişikliği yalnızca .NET Framework 4.6 veya üzerini hedefleyen uygulamaları etkilediğinden, .NET Framework 4.5.2'yi hedefleyerek bu kesme önlenebilir. .NET Framework 4.6 veya üstünü hedefleyen uygulamalar da aşağıdaki uyumluluk anahtarını ayarlayarak bu sorunu geçici olarak çözebilir:

AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);

Bu sorun.NET Framework 4.6.2'de WPF tarafından düzeltilmiştir. Kb 3139549 aracılığıyla .NET Frameworks 4.6, 4.6.1'de de düzeltilmiştir. .NET Framework 4.6 veya üzerini hedefleyen uygulamalar WPF uygulamalarında doğru davranışı otomatik olarak alır - System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) Dispatcher işlemlerinde korunur.

Veri Akışı Adı Değer
Kapsam İkincil
Sürüm 4.6
Tür Yeniden Hedefleme