.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
- CultureInfo.CurrentCulture
- Thread.CurrentCulture
- CultureInfo.CurrentUICulture
- Thread.CurrentUICulture
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 veyafinally
bloğundacatch
değerlendirilirse, yeni 64 bit JIT derleyicisi kodu iyileştirdiğinde veyafinally
bloğundancatch
koşulu kaldırırif
.try
Sonuç olarak, veyafinally
bloğundaki deyimininif
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
birREG_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
birREG_DWORD
değer ekleyebilirsiniz. değeri1
eski 64 bit JIT derleyicisini etkinleştirir; değeri0
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 |
Ağ
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
- System.Net.Security.SslStream
- System.Net.ServicePointManager
- System.Net.Http.HttpClient
- System.Net.Mail.SmtpClient
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
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
- System.Net.Security.SslStream
- System.Net.ServicePointManager
- System.Net.Http.HttpClient
- System.Net.Mail.SmtpClient
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
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
- XmlWriter.WriteAttributeString(String, String)
- XmlWriter.WriteAttributeString(String, String, String)
- XmlWriter.WriteAttributeString(String, String, String, String)
- XmlWriter.WriteAttributeStringAsync(String, String, String, String)
- XmlWriter.WriteCData(String)
- XmlWriter.WriteCDataAsync(String)
- XmlWriter.WriteChars(Char[], Int32, Int32)
- XmlWriter.WriteCharsAsync(Char[], Int32, Int32)
- XmlWriter.WriteComment(String)
- XmlWriter.WriteCommentAsync(String)
- XmlWriter.WriteEntityRef(String)
- XmlWriter.WriteEntityRefAsync(String)
- XmlWriter.WriteRaw(Char[], Int32, Int32)
- XmlWriter.WriteProcessingInstruction(String, String)
- XmlWriter.WriteProcessingInstructionAsync(String, String)
- XmlWriter.WriteRaw(String)
- XmlWriter.WriteRawAsync(Char[], Int32, Int32)
- XmlWriter.WriteRawAsync(String)
- XmlWriter.WriteString(String)
- XmlWriter.WriteStringAsync(String)
- XmlWriter.WriteSurrogateCharEntity(Char, Char)
- XmlWriter.WriteSurrogateCharEntityAsync(Char, Char)
- XmlWriter.WriteValue(String)
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
- ZipFile.CreateFromDirectory(String, String)
- ZipFile.CreateFromDirectory(String, String, CompressionLevel, Boolean)
- ZipFile.CreateFromDirectory(String, String, CompressionLevel, Boolean, Encoding)
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
- BasicHttpSecurityMode.TransportWithMessageCredential
- BasicHttpsSecurityMode.TransportWithMessageCredential
- SecurityMode.TransportWithMessageCredential
- WSFederationHttpSecurityMode.TransportWithMessageCredential
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.ArgumentNullException
oluş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.ArgumentNullException
oluş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ğilsenull
System.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 true
anahtarı 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
- ClaimsIdentity(IIdentity)
- ClaimsIdentity(IIdentity, IEnumerable<Claim>)
- ClaimsIdentity(IIdentity, IEnumerable<Claim>, String, String, String)
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
- CultureInfo.CurrentCulture
- Thread.CurrentCulture
- CultureInfo.CurrentUICulture
- Thread.CurrentUICulture
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://
).
Alternatif olarak, AppContext anahtarını true
olarak 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
- RSA.ImportParameters(RSAParameters)
- RSACng.ImportParameters(RSAParameters)
- RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2)
- RSACertificateExtensions.GetRSAPublicKey(X509Certificate2)
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:
- Hizmetin eşzamanlılık modunu veya ConcurrencyMode.Multipleolarak ConcurrencyMode.Single ayarlayın. Örneğin:
[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:
- veya Task<TResult>döndüren Task bir yöntemde özelliğinin değerini OperationContext.Current alırsınız.
- Nesnenin örneğini OperationContextScope bir
using
yan tümcesinde oluşturursunuz. - içindeki
using statement
özelliğinin OperationContext.Current değerini alırsınız. Örneğin:
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 |