Změna cílení migrace na rozhraní .NET Framework 4.6.x
Tento článek obsahuje seznam problémů s kompatibilitou aplikací, které byly zavedeny v rozhraní .NET Framework 4.6, 4.6.1 a 4.6.2.
.NET Framework 4.6
ASP.NET
HtmlTextWriter nevykresluje <br/>
element správně
Detaily
Počínaje rozhraním .NET Framework 4.6 se voláním RenderBeginTag(String) a RenderEndTag() prvkem <BR />
správně vloží pouze jeden <BR />
(místo dvou).
Návrh
Pokud aplikace závisí na další <BR />
značce, RenderBeginTag(String) měla by se volat podruhé. Všimněte si, že tato změna chování má vliv pouze na aplikace, které cílí na rozhraní .NET Framework 4.6 nebo novější, takže další možností je cílit na předchozí verzi rozhraní .NET Framework, aby bylo možné získat staré chování.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
ClickOnce
Aplikace publikované pomocí ClickOnce, které používají certifikát SHA-256 pro podepisování kódu, se nemusí v systému Windows 2003 podařit
Detaily
Spustitelný soubor je podepsaný pomocí SHA256. Dříve byla podepsána pomocí SHA1 bez ohledu na to, jestli podpisový certifikát kódu byl SHA-1 nebo SHA-256. Toto se vztahuje na:
- Všechny aplikace vytvořené pomocí sady Visual Studio 2012 nebo novější
- Aplikace vytvořené pomocí sady Visual Studio 2010 nebo starší v systémech s rozhraním .NET Framework 4.5. Kromě toho, pokud je k dispozici rozhraní .NET Framework 4.5 nebo novější, je manifest ClickOnce podepsán také pomocí SHA-256 pro certifikáty SHA-256 bez ohledu na verzi rozhraní .NET Framework, pro kterou byl kompilován.
Návrh
Změna při podepisování spustitelného souboru ClickOnce má vliv pouze na systémy Windows Server 2003; vyžadují instalaci znalostní báze 938397. Změna při podepisování manifestu pomocí SHA-256, i když aplikace cílí na rozhraní .NET Framework 4.0 nebo starší verze, představuje závislost modulu runtime na rozhraní .NET Framework 4.5 nebo novější verzi.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.5 |
Typ | Změna cílení |
ClickOnce podporuje SHA-256 v 4.0 cílových aplikacích.
Detaily
Dříve by aplikace ClickOnce s certifikátem podepsaným pomocí SHA-256 vyžadovala, aby byla k dispozici rozhraní .NET Framework 4.5 nebo novější, i když aplikace cílí na verzi 4.0. Aplikace ClickOnce cílené na rozhraní .NET Framework 4.0 teď můžou běžet v rozhraní .NET Framework 4.0, i když jsou podepsané pomocí SHA-256.
Návrh
Tato změna odebere tuto závislost a umožní použití certifikátů SHA-256 k podepisování aplikací ClickOnce, které cílí na rozhraní .NET Framework 4 a starší verze.
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
Základ
Tok CurrentCulture a CurrentUICulture napříč úlohami
Detaily
Počínaje rozhraním .NET Framework 4.6 System.Globalization.CultureInfo.CurrentCulture a System.Globalization.CultureInfo.CurrentUICulture jsou uloženy ve vlákně System.Threading.ExecutionContext, které proudí napříč asynchronními operacemi. To znamená, že změny System.Globalization.CultureInfo.CurrentCulture nebo System.Globalization.CultureInfo.CurrentUICulture se projeví v úlohách, které se později spustí asynchronně. Toto chování se liší od chování předchozích verzí rozhraní .NET Framework (které by se resetovalo System.Globalization.CultureInfo.CurrentCulture a System.Globalization.CultureInfo.CurrentUICulture ve všech asynchronních úlohách).
Návrh
Aplikace ovlivněné touto změnou můžou tuto změnu obejít tak, že explicitně nastaví požadovanou System.Globalization.CultureInfo.CurrentCulture nebo System.Globalization.CultureInfo.CurrentUICulture jako první operaci v asynchronní úloze. Můžete také zvolit staré chování (netečování System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) nastavením následujícího přepínače kompatibility:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Tento problém vyřešil WPF v rozhraní .NET Framework 4.6.2. Byl také opraven v rozhraní .NET Frameworks 4.6, 4.6.1 až KB 3139549. Aplikace, které cílí na rozhraní .NET Framework 4.6 nebo novější, automaticky získají správné chování v aplikacích WPF – System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) se zachovají napříč operacemi Dispečera.
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- CultureInfo.CurrentCulture
- Thread.CurrentCulture
- CultureInfo.CurrentUICulture
- Thread.CurrentUICulture
Názvy událostí pro Windows se nemůžou lišit pouze příponou Start nebo Stop.
Detaily
Modul runtime v rozhraní .NET Framework 4.6 a 4.6.1 vyvolá ArgumentException , když se dva názvy událostí trasování událostí pro Windows (ETW) liší pouze příponou Start nebo Stop (jako když je jedna událost pojmenována LogUser
a druhá je pojmenovaná LogUserStart
). V tomto případě modul runtime nemůže sestavit zdroj událostí, který nemůže generovat žádné protokolování.
Návrh
Chcete-li zabránit výjimce, ujistěte se, že se žádné dva názvy událostí liší pouze příponou Start nebo Stop. Tento požadavek se odebere počínaje rozhraním .NET Framework 4.6.2; modul runtime může nejednoznačit názvy událostí, které se liší pouze příponou Start a Stop.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6 |
Typ | Změna cílení |
Entity Framework
Sestavení souboru Entity Framework EDMX v sadě Visual Studio 2013 může při použití úloh EntityDeploySplit nebo EntityClean selhat s chybou MSB4062
Detaily
U nástrojů MSBuild 12.0 (zahrnutých v sadě Visual Studio 2013) se změnilo umístění souborů MSBuild, což vede k tomu, že starší soubory cílů Entity Framework jsou neplatné. Úlohy EntityDeploySplit
a EntityClean
v důsledku toho selhávají, protože nenajdou knihovnu Microsoft.Data.Entity.Build.Tasks.dll
. K tomuto narušení vazby nedochází změnou v rozhraní .NET Framework, ale změnou v sadě nástrojů MSBuild / Visual Studio. Projeví se jen při upgradu nástrojů při vývojáře, ne při samotném upgradu rozhraní .NET Framework.
Návrh
Soubory cílů Entity Framework jsou ve verzi .NET Framework 4.6 opraveny tak, aby fungovaly s novým rozložením nástrojů MSBuild. Upgradem na tuto verzi rozhraní Framework se problém vyřeší. Případně můžete opravit soubory cílů přímo pomocí tohoto alternativního řešení.
Jméno | Hodnota |
---|---|
Obor | Hlavní verze |
Verze | 4.5.1 |
Typ | Změna cílení |
JIT
Ret IL není povolený v oblasti try
Detaily
Na rozdíl od kompilátoru JIT64 za běhu nepovoluje nástroj RyuJIT (použitý v rozhraní .NET Framework 4.6) pokyn k retu v il v oblasti try. Vrácení z oblasti try je zakázáno specifikací ECMA-335 a žádný známý spravovaný kompilátor nevygeneruje takový IL. Kompilátor JIT64 však provede takové IL, pokud se vygeneruje pomocí generování reflexe.
Návrh
Pokud aplikace generuje IL, která obsahuje ret opcode v oblasti try, může aplikace cílit na rozhraní .NET Framework 4.5, aby používala starou JIT a vyhnula se tomuto přerušení. Případně může být vygenerovaná IL aktualizována tak, aby se vrátila po oblasti try.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6 |
Typ | Změna cílení |
Nový 64bitový kompilátor JIT v rozhraní .NET Framework 4.6
Detaily
Počínaje rozhraním .NET Framework 4.6 se pro kompilaci za běhu používá nový 64bitový kompilátor JIT. V některých případech se vyvolá neočekávaná výjimka nebo se zjistí jiné chování, než když se aplikace spustí pomocí 32bitového kompilátoru nebo staršího 64bitového kompilátoru JIT. Tato změna nemá vliv na 32bitový kompilátor JIT. Mezi známé rozdíly patří:
- Za určitých podmínek může operace rozbalení vyvolat v buildech vydané verze se zapnutou NullReferenceException optimalizací.
- V některých případech může spuštění produkčního kódu ve velkém těle metody vyvolat StackOverflowException.
- Za určitých podmínek se struktury předané metodě považují za odkazové typy, nikoli jako typy hodnot v buildech Release. Jedním z projevů tohoto problému je, že jednotlivé položky v kolekci se zobrazují v neočekávaném pořadí.
- Za určitých podmínek je porovnání UInt16 hodnot s vysokou bitovou sadou nesprávné, pokud je povolená optimalizace.
- Za určitých podmínek, zejména při inicializaci hodnot pole, inicializace paměti inicializací OpCodes.Initblk instrukce IL může inicializovat paměť s nesprávnou hodnotou. Výsledkem může být neošetřená výjimka nebo nesprávný výstup.
- Za určitých výjimečných podmínek může podmíněný bitový test vrátit nesprávnou Boolean hodnotu nebo vyvolat výjimku, pokud jsou povoleny optimalizace kompilátoru.
- Za určitých podmínek platí, že pokud
if
se příkaz použije k otestování podmínky před zadánímtry
bloku a při ukončenítry
bloku a vyhodnocuje se stejná podmínka vcatch
bloku nebofinally
bloku, nový 64bitový kompilátor JIT odebereif
podmínkucatch
z bloku nebofinally
bloku, když optimalizuje kód. V důsledku toho se kód uvnitřif
příkazu vcatch
blokufinally
provede bezpodmínečně.
Návrh
Zmírnění známých problémů
Pokud narazíte na výše uvedené problémy, můžete je vyřešit některým z následujících způsobů:
Upgradujte na rozhraní .NET Framework 4.6.2. Nový 64bitový kompilátor, který je součástí rozhraní .NET Framework 4.6.2, řeší každý z těchto známých problémů.
Spuštěním služba Windows Update se ujistěte, že je vaše verze Windows aktuální. Aktualizace služeb pro rozhraní .NET Framework 4.6 a 4.6.1 řeší všechny tyto problémy s výjimkou NullReferenceException operace rozbalování.
Zkompilujte pomocí staršího 64bitového kompilátoru JIT. Další informace o tom, jak to udělat, najdete v části Zmírnění dalších problémů . Zmírnění jiných problémů
Pokud narazíte na jakýkoli jiný rozdíl v chování mezi kódem zkompilovaným pomocí staršího 64bitového kompilátoru a nového 64bitového kompilátoru JIT nebo mezi verzemi ladění a verze aplikace, které jsou kompilovány s novým 64bitovým kompilátorem JIT, můžete aplikaci zkompilovat pomocí staršího 64bitového kompilátoru JIT:Na základě jednotlivých aplikací můžete přidat < prvek do konfiguračního souboru vaší aplikace. Následující příkaz zakáže kompilaci s novým 64bitovým kompilátorem JIT a místo toho používá starší 64bitový kompilátor JIT.
<?xml version ="1.0"?> <configuration> <runtime> <useLegacyJit enabled="1" /> </runtime> </configuration>
Pro jednotlivé uživatele můžete přidat hodnotu pojmenovanou
REG_DWORD
useLegacyJit
kHKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework
klíči registru. Hodnota 1 umožňuje starší 64bitový kompilátor JIT; hodnota 0 ji zakáže a povolí nový 64bitový kompilátor JIT.Na základě jednotlivých počítačů můžete přidat hodnotu pojmenovanou
REG_DWORD
useLegacyJit
kHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
klíči registru. Hodnota1
povolí starší 64bitový kompilátor JIT. Hodnota0
ho zakáže a povolí nový 64bitový kompilátor JIT. O problému nám také můžete dát vědět tím, že nahlásíte chybu v Microsoft Connectu.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6 |
Typ | Změna cílení |
Sítě
Ověření identifikátoru EKU certifikátu
Detaily
Počínaje rozhraním .NET Framework 4.6 SslStream provádí ověřování identifikátoru objektu (OID) nebo ServicePointManager třídy rozšířené použití klíče (EKU). Rozšíření rozšířeného použití klíče (EKU) je kolekce identifikátorů objektů (OID), která označuje aplikace, které klíč používají. Ověřování EKU OID používá zpětné volání vzdáleného certifikátu k zajištění toho, aby vzdálený certifikát měl správné identifikátory OID pro zamýšlený účel.
Návrh
Pokud je tato změna nežádoucí, můžete zakázat ověření identifikátoru EKU certifikátu přidáním následujícího přepínače do <AppContextSwitchOverrides> v konfiguračním ` souboru aplikace:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontCheckCertificateEKUs=true" />
</runtime>
Důležité
Toto nastavení je k dispozici pouze pro zpětnou kompatibilitu. Jeho použití se jinak nedoporučuje.
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- System.Net.Security.SslStream
- System.Net.ServicePointManager
- System.Net.Http.HttpClient
- System.Net.Mail.SmtpClient
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
Protokoly Tls 1.0, 1.1 a 1.2 podporované v system.Net.ServicePointManager a System.Net.Security.SslStream
Detaily
Počínaje rozhraním .NET Framework 4.6 ServicePointManager mohou a SslStream třídy používat pouze jeden z následujících tří protokolů: Tls1.0, Tls1.1 nebo Tls1.2. Protokol SSL3.0 a šifry RC4 se nepodporují.
Návrh
Doporučeným zmírněním rizik je upgrade aplikace na straně serveru na Tls1.0, Tls1.1 nebo Tls1.2. Pokud to není možné nebo pokud jsou klientské aplikace přerušené, System.AppContext můžete třídu použít k odhlášení z této funkce jedním ze dvou způsobů:
- Nastavením compat přepínače na System.AppContextprogram , jak je vysvětleno zde.
- Přidáním následujícího řádku do
<runtime>
části souboru app.config:
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Protokol TLS 1.x ve výchozím nastavení předává příznak SCH_SEND_AUX_RECORD do základního rozhraní API SCHANNEL.
Detaily
Při použití protokolu TLS 1.x se rozhraní .NET Framework spoléhá na základní rozhraní WINDOWS SCHANNEL API. Počínaje rozhraním .NET Framework 4.6 se příznak SCH_SEND_AUX_RECORD ve výchozím nastavení předává SCHANNEL. To způsobí, že SCHANNEL rozdělí data do dvou samostatných záznamů, první jako jeden bajt a druhý jako n-1 bajtů. Ve výjimečných případech se tím přeruší komunikace mezi klienty a existujícími servery, které předpokládají, že se data nacházejí v jednom záznamu.
Návrh
Pokud tato změna přeruší komunikaci s existujícím serverem, můžete zakázat odesílání příznaku SCH_SEND_AUX_RECORD a obnovit předchozí chování při rozdělení dat do samostatných záznamů přidáním následujícího přepínače do <AppContextSwitchOverrides>
elementu v <runtime>
části konfiguračního souboru aplikace:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchSendAuxRecord=true" />
</runtime>
Důležité
Toto nastavení je k dispozici pouze pro zpětnou kompatibilitu. Jeho použití se jinak nedoporučuje.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- System.Net.Security.SslStream
- System.Net.ServicePointManager
- System.Net.Http.HttpClient
- System.Net.Mail.SmtpClient
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
WCF (Windows Communication Foundation)
Volání CreateDefaultAuthorizationContext s argumentem null se změnilo.
Detaily
Implementace System.IdentityModel.Policy.AuthorizationContext vrácená voláním System.IdentityModel.Policy.AuthorizationContext.CreateDefaultAuthorizationContext(IList<IAuthorizationPolicy>) argumentu null authorizationPolicies změnila jeho implementaci v rozhraní .NET Framework 4.6.
Návrh
Ve výjimečných případech můžou aplikace WCF, které používají vlastní ověřování, vidět rozdíly v chování. V takových případech je možné předchozí chování obnovit jedním ze dvou způsobů:
Překompilujte aplikaci tak, aby cílila na starší verzi rozhraní .NET Framework než 4.6. Pro služby hostované službou IIS použijte
<httpRuntime targetFramework="x.x">
element k cílení na starší verzi rozhraní .NET Framework.Do části souboru app.config přidejte následující řádek
<appSettings>
:<add key="appContext.SetSwitch:Switch.System.IdentityModel.EnableCachedEmptyDefaultAuthorizationContext" value="true" />
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Windows Forms
Icon.ToBitmap úspěšně převede ikony s rámečky PNG na bitmapové objekty
Detaily
Počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6, Icon.ToBitmap metoda úspěšně převede ikony se snímky PNG na bitmapové objekty.
V aplikacích, které cílí na rozhraní .NET Framework 4.5.2 a starší verze, vyvolá metoda ArgumentOutOfRangeException výjimku, Icon.ToBitmap pokud objekt Icon má rámce PNG.
Tato změna má vliv na aplikace, které jsou rekompilovány tak, aby cílily na rozhraní .NET Framework 4.6 a implementují speciální zpracování pro ArgumentOutOfRangeException vyvolání, pokud objekt Icon má rámce PNG. Při spuštění v rozhraní .NET Framework 4.6 je převod úspěšný, ArgumentOutOfRangeException již není vyvolána, a proto obslužná rutina výjimky již není vyvolána.
Návrh
Pokud je toto chování nežádoucí, můžete předchozí chování zachovat přidáním následujícího prvku do <runtime>
části souboru app.config:
<AppContextSwitchOverrides
value="Switch.System.Drawing.DontSupportPngFramesInIcons=true" />
Pokud soubor app.config již obsahuje AppContextSwitchOverrides
prvek, měla by se nová hodnota sloučit s atributem value takto:
<AppContextSwitchOverrides
value="Switch.System.Drawing.DontSupportPngFramesInIcons=true;<previous key>=<previous value>" />
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Windows Presentation Foundation (WPF)
CurrentCulture se v rámci operací dispečeru WPF nezachovává.
Detaily
Počínaje rozhraním .NET Framework 4.6 dojde ke System.Globalization.CultureInfo.CurrentCulture ztrátě změn nebo System.Globalization.CultureInfo.CurrentUICulture provedených v rámci System.Windows.Threading.Dispatcher operace dispečera. Podobně se změny nebo System.Globalization.CultureInfo.CurrentUICulture provedené System.Globalization.CultureInfo.CurrentCulture mimo operaci Dispatcher nemusí při spuštění této operace projevit. Prakticky to znamená, že System.Globalization.CultureInfo.CurrentCulture změny System.Globalization.CultureInfo.CurrentUICulture nemusí přetékat mezi zpětnými voláními uživatelského rozhraní WPF a jiným kódem v aplikaci WPF. Důvodem je změnaSystem.Threading.ExecutionContext, která způsobí System.Globalization.CultureInfo.CurrentCulture a System.Globalization.CultureInfo.CurrentUICulture uloží se v kontextu spouštění počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6. Operace dispečera WPF ukládají kontext spuštění použitý k zahájení operace a obnovení předchozího kontextu po dokončení operace. Vzhledem k tomu System.Globalization.CultureInfo.CurrentCulture , že jsou System.Globalization.CultureInfo.CurrentUICulture nyní součástí tohoto kontextu, změny v rámci operace dispečera se neuchovávají mimo operaci.
Návrh
Aplikace ovlivněné touto změnou můžou tuto změnu obejít uložením požadovaného System.Globalization.CultureInfo.CurrentCulture pole nebo System.Globalization.CultureInfo.CurrentUICulture do pole a vrácením všech kontrolních orgánů operací dispečera (včetně obslužných rutin zpětného volání událostí uživatelského rozhraní), které jsou správné System.Globalization.CultureInfo.CurrentCulture a System.Globalization.CultureInfo.CurrentUICulture nastavené. Alternativně platí, že změna ExecutionContext, která je základem této změny WPF, má vliv pouze na aplikace, které cílí na rozhraní .NET Framework 4.6 nebo novější, můžete se vyhnout tím, že cílí na rozhraní .NET Framework 4.5.2.Apps, které cílí na rozhraní .NET Framework 4.6 nebo novější, můžou tento problém obejít také nastavením následujícího přepínače kompatibility:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Tento problém vyřešil WPF v rozhraní .NET Framework 4.6.2. Byl také opraven v rozhraní .NET Frameworks 4.6, 4.6.1 až KB 3139549. Aplikace, které cílí na rozhraní .NET Framework 4.6 nebo novější, automaticky získají správné chování v aplikacích WPF – System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) se zachovají napříč operacemi Dispečera.
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
Rozložení WPF se změnilo zaokrouhlování okrajů.
Detaily
Způsob, jakým jsou okraje zaoblené a ohraničení a pozadí uvnitř nich se změnilo. Výsledkem této změny:
- Šířka nebo výška prvků se může zvětšit nebo zmenšit maximálně o jeden pixel.
- Umístění objektu se může pohybovat maximálně o jeden pixel.
- Zarovnané prvky můžou být svisle nebo vodorovně od středu maximálně o jeden pixel. Ve výchozím nastavení je toto nové rozložení povolené jenom pro aplikace, které cílí na rozhraní .NET Framework 4.6.
Návrh
Vzhledem k tomu, že tato změna má tendenci eliminovat výřez pravého nebo dolního rohu ovládacích prvků WPF s vysokou úrovní DPI, aplikace, které cílí na dřívější verze rozhraní .NET Framework, ale jsou spuštěné v rozhraní .NET Framework 4.6, mohou se k tomuto novému chování přihlásit přidáním následujícího řádku do <runtime>
části souboru app.config:
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=false" />
Aplikace, které cílí na rozhraní .NET Framework 4.6, ale chtějí, aby se ovládací prvky WPF vykreslují pomocí předchozího algoritmu rozložení, můžou provést přidáním následujícího řádku do <runtime>
části souboru app.config:
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=true" />
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
XML, XSLT
XmlWriter vyvolá při neplatných náhradních párech
Detaily
U aplikací, které cílí na rozhraní .NET Framework 4.5.2 nebo předchozí verze, zápis neplatného náhradního páru pomocí náhradního zpracování výjimek nevyvolá výjimku vždy. U aplikací, které cílí na rozhraní .NET Framework 4.6, při pokusu o zápis neplatného náhradního páru vyvolá výjimku System.ArgumentException.
Návrh
V případě potřeby se tomuto přerušení můžete vyhnout tím, že cílíte na rozhraní .NET Framework 4.5.2 nebo starší. Alternativně je možné před zápisem neplatných náhradních párů předem zpracovat do platného kódu XML.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- 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)
Ověření schématu XSD teď správně detekuje porušení jedinečných omezení, pokud se používají složené klíče a jeden klíč je prázdný.
Detaily
Verze rozhraní .NET Framework před verzí 4.6 měly chybu, která způsobila ověřování XSD, aby nerozpoznala jedinečná omezení složených klíčů, pokud jeden z klíčů byl prázdný. V rozhraní .NET Framework 4.6 je tento problém opraven. Výsledkem bude přesnější ověření, ale může to také vést k tomu, že se některá xml neovědí, která by dříve měla.
Návrh
Pokud je potřeba volné ověřování rozhraní .NET Framework 4.0, může ověřování aplikace cílit na verzi 4.5 (nebo starší) rozhraní .NET Framework. Při opětovném cílení na rozhraní .NET Framework 4.6 byste ale měli provést kontrolu kódu, abyste měli jistotu, že se neočekává ověření duplicitních složených klíčů (jak je popsáno v popisu tohoto problému).
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6 |
Typ | Změna cílení |
.NET Framework 4.6.1
Základ
Změna znaku oddělovače cest ve vlastnosti FullName objektů ZipArchiveEntry
Detaily
U aplikací, které cílí na rozhraní .NET Framework 4.6.1 a novější verze, se znak oddělovače cesty změnil z zpětného lomítka ("\") na lomítko ("/") ve FullName vlastnosti objektů vytvořených ZipArchiveEntry CreateFromDirectory přetíženími metody. Tato změna přináší implementaci rozhraní .NET do souladu s oddílem 4.4.17.1 specifikace formátu souboru .ZIP a umožňuje dekompresi archivů .ZIP v systémech mimo Windows.
Dekomprese souboru ZIP vytvořeného aplikací, která cílí na předchozí verzi rozhraní .NET Framework v operačních systémech jiných než Windows, jako je Například Macintosh, nedokáže zachovat adresářovou strukturu. Například na Macintosh vytvoří sadu souborů, jejichž název souboru zřetězí cestu k adresáři, spolu s libovolnými znaky zpětného lomítka ("\") a název souboru. V důsledku toho není zachována adresářová struktura dekomprimovaných souborů.
Návrh
Dopad této změny na .ZIP soubory, které jsou dekomprimovány na operační systém Windows rozhraními API v oboru názvů rozhraní .NET Framework System.IO , by mělo být minimální, protože tato rozhraní API mohou bez problémů zpracovat lomítko ("/") nebo zpětné lomítko ("\") jako znak oddělovače cesty.
Pokud je tato změna nežádoucí, můžete se z ní odhlásit přidáním konfiguračního nastavení do <runtime>
části konfiguračního souboru vaší aplikace. Následující příklad ukazuje <runtime>
oddíl i Switch.System.IO.Compression.ZipFile.UseBackslash
přepínač pro odhlášení:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=true" />
</runtime>
Aplikace, které cílí na předchozí verze rozhraní .NET Framework, ale jsou spuštěné v rozhraní .NET Framework 4.6.1 a novějších verzích, se můžou k tomuto chování přihlásit přidáním nastavení konfigurace do <runtime>
části konfiguračního souboru aplikace. Na následujícím obrázku Switch.System.IO.Compression.ZipFile.UseBackslash
je <runtime>
uveden oddíl i přepínač pro výslovný souhlas.
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=false" />
</runtime>
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.1 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- ZipFile.CreateFromDirectory(String, String)
- ZipFile.CreateFromDirectory(String, String, CompressionLevel, Boolean)
- ZipFile.CreateFromDirectory(String, String, CompressionLevel, Boolean, Encoding)
WCF (Windows Communication Foundation)
Vazba WCF s režimem zabezpečení TransportWithMessageCredential
Detaily
Počínaje rozhraním .NET Framework 4.6.1 lze vazbu WCF, která používá režim zabezpečení TransportWithMessageCredential, nastavit tak, aby přijímala zprávy s nepodepsanými hlavičkami "to" pro asymetrické klíče zabezpečení. Ve výchozím nastavení budou hlavičky bez znaménka do nadále odmítnuty v rozhraní .NET Framework 4.6.1. Budou přijaty pouze v případě, že se aplikace přihlásí k tomuto novému režimu operace pomocí přepínače.System.ServiceModel.AllowUnsignedToHeader konfiguračního přepínače.
Návrh
Vzhledem k tomu, že se jedná o funkci výslovného souhlasu, neměla by mít vliv na chování stávajících aplikací.
Pokud chcete určit, jestli se nové chování používá, nebo ne, použijte následující nastavení konfigurace:
<runtime>
<AppContextSwitchOverrides value="Switch.System.ServiceModel.AllowUnsignedToHeader=true" />
</runtime>
Jméno | Hodnota |
---|---|
Obor | Průhledné |
Verze | 4.6.1 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- BasicHttpSecurityMode.TransportWithMessageCredential
- BasicHttpsSecurityMode.TransportWithMessageCredential
- SecurityMode.TransportWithMessageCredential
- WSFederationHttpSecurityMode.TransportWithMessageCredential
X509CertificateClaimSet.FindClaims Považuje všechny typy deklarací identity
Detaily
V aplikacích, které cílí na rozhraní .NET Framework 4.6.1, pokud je sada deklarací identity X509 inicializována z certifikátu, který má v poli SAN více položek DNS, System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(String, String) se metoda pokusí shodovat s argumentem claimType se všemi položkami DNS. U aplikací, které cílí na předchozí verze rozhraní .NET Framework, se System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(String, String) metoda pokusí shodovat s argumentem claimType pouze s poslední položkou DNS.
Návrh
Tato změna má vliv pouze na aplikace, které cílí na rozhraní .NET Framework 4.6.1. Tato změna může být zakázaná (nebo povolená, pokud cílíte před-4.6.1) s přepínačem kompatibility DisableMultipleDNSEntries .
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6.1 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Windows Forms
Application.FilterMessage se už nevyvolá pro opětovné implementace IMessageFilter.PreFilterMessage
Detaily
Před rozhraním .NET Framework 4.6.1 by voláním, které PreFilterMessage(Message) volal System.Windows.Forms.Application.AddMessageFilter(IMessageFilter) nebo System.Windows.Forms.Application.RemoveMessageFilter(IMessageFilter) (při voláníDoEvents()) způsobilo chybu System.IndexOutOfRangeException.FilterMessage(Message)
Počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6.1, už se tato výjimka nevyvolá a filtry opětovného vyvolání, jak je popsáno výše, lze použít.
Návrh
Mějte na paměti, že FilterMessage(Message) již nebude hodit za chování opětovného účastníka PreFilterMessage(Message) popsané výše. To se týká jenom aplikací, které cílí na rozhraní .NET Framework 4.6.1.Apps, které cílí na rozhraní .NET Framework 4.6.1, se můžou od této změny odhlásit (nebo aplikace, které cílí na starší architektury, se můžou přihlásit) pomocí přepínače kompatibility DontSupportReentrantFilterMessage .
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.1 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Windows Presentation Foundation (WPF)
Volání System.Windows.Input.PenContext.Disable v systémech s podporou dotykového ovládání mohou vyvolat výjimku ArgumentException.
Detaily
Za určitých okolností můžou volání interní metody System.Windows.Intput.PenContext.Disable v systémech s podporou dotykového ovládání vyvolat neošetřené T:System.ArgumentException
z důvodu opětovného zobrazení.
Návrh
Tento problém je vyřešený v rozhraní .NET Framework 4.7. Pokud chcete této výjimce zabránit, upgradujte na verzi rozhraní .NET Framework počínaje rozhraním .NET Framework 4.7.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.1 |
Typ | Změna cílení |
.NET Framework 4.6.2
ASP.NET
HttpRuntime.AppDomainAppPath vyvolá výjimku NullReferenceException
Detaily
V rozhraní .NET Framework 4.6.2 vyvolá modul runtime T:System.NullReferenceException
při načítání P:System.Web.HttpRuntime.AppDomainAppPath
hodnoty, která obsahuje znaky null. V rozhraní .NET Framework 4.6.1 a starších verzích modul runtime vyvolá výjimku T:System.ArgumentNullException
.
Návrh
Na tuto změnu můžete odpovědět některým z následujících kroků:
T:System.NullReferenceException
Zpracujte, pokud je aplikace spuštěna v rozhraní .NET Framework 4.6.2.- Upgradujte na rozhraní .NET Framework 4.7, který obnoví předchozí chování a vyvolá chybu
T:System.ArgumentNullException
.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Základ
Dešifrovač AesCryptoServiceProvider poskytuje opakovaně použitelnou transformaci.
Detaily
Počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6.2, AesCryptoServiceProvider dešifrovací nástroj poskytuje opakovaně použitelnou transformaci. Po volání System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32)se transformace znovu inicializuje a dá se znovu použít. U aplikací, které cílí na starší verze rozhraní .NET Framework, se pokoušíte dešifrovací nástroj znovu použít voláním System.Security.Cryptography.CryptoAPITransform.TransformBlock(Byte[], Int32, Int32, Byte[], Int32) po volání vyvolání System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32) CryptographicException nebo vytvoření poškozených dat.
Návrh
Dopad této změny by měl být minimální, protože se jedná o očekávané chování. Aplikace, které závisí na předchozím chování, se můžou z tohoto chování odhlásit přidáním následujícího nastavení konfigurace do <runtime>
části konfiguračního souboru aplikace:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.AesCryptoServiceProvider.DontCorrectlyResetDecryptor=true"/>
</runtime>
Aplikace, které cílí na předchozí verzi rozhraní .NET Framework, ale běží pod verzí rozhraní .NET Framework počínaje rozhraním .NET Framework 4.6.2, se k ní můžou přihlásit přidáním následujícího nastavení konfigurace do <runtime>
části konfiguračního souboru aplikace:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.AesCryptoServiceProvider.DontCorrectlyResetDecryptor=false"/>
</runtime>
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Volání konstruktorů ClaimsIdentity
Detaily
Počínaje rozhraním .NET Framework 4.6.2 došlo ke změně způsobu, jakým ClaimsIdentity konstruktory s parametrem System.Security.Principal.IIdentity nastavují System.Security.Claims.ClaimsIdentity.Actor vlastnost. System.Security.Principal.IIdentity Pokud argument je ClaimsIdentity objekt a System.Security.Claims.ClaimsIdentity.Actor vlastnost tohoto ClaimsIdentity objektu není null
, System.Security.Claims.ClaimsIdentity.Actor vlastnost je připojena pomocí Clone() metody. V rozhraní 4.6.1 a starších verzích System.Security.Claims.ClaimsIdentity.Actor je vlastnost připojena jako existující odkaz. Vzhledem k této změně počínaje rozhraním .NET Framework 4.6.2 System.Security.Claims.ClaimsIdentity.Actor není vlastnost nového ClaimsIdentity objektu rovna System.Security.Claims.ClaimsIdentity.Actor vlastnosti argumentu konstruktoru System.Security.Principal.IIdentity . V rozhraní .NET Framework 4.6.1 a starších verzích je stejný.
Návrh
Pokud je toto chování nežádoucí, můžete předchozí chování obnovit nastavením Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentity
přepínače v konfiguračním souboru aplikace na true
. To vyžaduje, abyste do <runtime>
části souboru web.config přidali následující položky:
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentity=true" />
</runtime>
</configuration>
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- ClaimsIdentity(IIdentity)
- ClaimsIdentity(IIdentity, IEnumerable<Claim>)
- ClaimsIdentity(IIdentity, IEnumerable<Claim>, String, String, String)
Změny normalizace cest
Detaily
Počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6.2, způsob, jakým modul runtime normalizuje cesty, se změnily. Normalizace cesty zahrnuje úpravu řetězce, který identifikuje cestu nebo soubor tak, aby odpovídal platné cestě v cílovém operačním systému. Normalizace obvykle zahrnuje:
- Canonicalizing component and directory separators.
- Použití aktuálního adresáře na relativní cestu
- Vyhodnocení relativního adresáře (.) nebo nadřazeného adresáře (..) v cestě
- Oříznutí zadaných znaků
Počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6.2, jsou ve výchozím nastavení povoleny následující změny normalizace cest:
- Modul runtime vzdoruje funkci GetFullPathName operačního systému za účelem normalizace cest.
- Normalizace už nezahrnuje oříznutí konce segmentů adresáře (například mezeru na konci názvu adresáře).
- Podpora syntaxe cesty zařízení v plném vztahu důvěryhodnosti, včetně
\\.\
a pro rozhraní API vstupně-výstupních operací souborů v mscorlib.dll,\\?\
. - Modul runtime neověřuje cesty syntaxe zařízení.
- Podporuje se použití syntaxe zařízení pro přístup k alternativním datovým proudům. Tyto změny zlepšují výkon a umožňují metodám přístup k dříve nepřístupným cestám. Tyto změny neovlivní aplikace, které cílí na rozhraní .NET Framework 4.6.1 a starší verze, ale jsou spuštěné v rozhraní .NET Framework 4.6.2 nebo novější.
Návrh
Aplikace, které cílí na rozhraní .NET Framework 4.6.2 nebo novější, můžou tuto změnu vyloučit a používat starší normalizaci přidáním následujícího oddílu <runtime>
konfiguračního souboru aplikace:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true" />
</runtime>
Aplikace, které cílí na rozhraní .NET Framework 4.6.1 nebo starší, ale běží na rozhraní .NET Framework 4.6.2 nebo novější, můžou povolit změny normalizace cest přidáním následujícího řádku do <runtime>
části souboru .configuration aplikace:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6.2 |
Typ | Změna cílení |
Tok CurrentCulture a CurrentUICulture napříč úlohami
Detaily
Počínaje rozhraním .NET Framework 4.6 System.Globalization.CultureInfo.CurrentCulture a System.Globalization.CultureInfo.CurrentUICulture jsou uloženy ve vlákně System.Threading.ExecutionContext, které proudí napříč asynchronními operacemi. To znamená, že změny System.Globalization.CultureInfo.CurrentCulture nebo System.Globalization.CultureInfo.CurrentUICulture se projeví v úlohách, které se později spustí asynchronně. Toto chování se liší od chování předchozích verzí rozhraní .NET Framework (které by se resetovalo System.Globalization.CultureInfo.CurrentCulture a System.Globalization.CultureInfo.CurrentUICulture ve všech asynchronních úlohách).
Návrh
Aplikace ovlivněné touto změnou můžou tuto změnu obejít tak, že explicitně nastaví požadovanou System.Globalization.CultureInfo.CurrentCulture nebo System.Globalization.CultureInfo.CurrentUICulture jako první operaci v asynchronní úloze. Můžete také zvolit staré chování (netečování System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) nastavením následujícího přepínače kompatibility:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Tento problém vyřešil WPF v rozhraní .NET Framework 4.6.2. Byl také opraven v rozhraní .NET Frameworks 4.6, 4.6.1 až KB 3139549. Aplikace, které cílí na rozhraní .NET Framework 4.6 nebo novější, automaticky získají správné chování v aplikacích WPF – System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) se zachovají napříč operacemi Dispečera.
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- CultureInfo.CurrentCulture
- Thread.CurrentCulture
- CultureInfo.CurrentUICulture
- Thread.CurrentUICulture
Názvy událostí pro Windows se nemůžou lišit pouze příponou Start nebo Stop.
Detaily
Modul runtime v rozhraní .NET Framework 4.6 a 4.6.1 vyvolá ArgumentException , když se dva názvy událostí trasování událostí pro Windows (ETW) liší pouze příponou Start nebo Stop (jako když je jedna událost pojmenována LogUser
a druhá je pojmenovaná LogUserStart
). V tomto případě modul runtime nemůže sestavit zdroj událostí, který nemůže generovat žádné protokolování.
Návrh
Chcete-li zabránit výjimce, ujistěte se, že se žádné dva názvy událostí liší pouze příponou Start nebo Stop. Tento požadavek se odebere počínaje rozhraním .NET Framework 4.6.2; modul runtime může nejednoznačit názvy událostí, které se liší pouze příponou Start a Stop.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6 |
Typ | Změna cílení |
Podpora dlouhých cest
Detaily
Počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6.2, jsou podporovány dlouhé cesty (až 32 tisíc znaků) a bylo odebráno omezení délky cesty o délce 260 znaků (nebo MAX_PATH
). U aplikací, které jsou rekompilované tak, aby cílily na rozhraní .NET Framework 4.6.2, cesty kódu, které dříve vyvolaly System.IO.PathTooLongException cestu, protože cesta překročila 260 znaků, teď vyvolá System.IO.PathTooLongException pouze za následujících podmínek:
- Délka cesty je větší než MaxValue (32 767) znaků.
- Operační systém vrátí
COR_E_PATHTOOLONG
nebo jeho ekvivalent. U aplikací, které cílí na rozhraní .NET Framework 4.6.1 a starší verze, modul runtime automaticky vyvolá System.IO.PathTooLongException pokaždé, když cesta překročí 260 znaků.
Návrh
U aplikací, které cílí na rozhraní .NET Framework 4.6.2, můžete vyloučit podporu dlouhých cest, pokud není žádoucí, přidáním následujícího postupu do <runtime>
části souboru app.config
:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=true" />
</runtime>
U aplikací, které cílí na starší verze rozhraní .NET Framework, ale běží na rozhraní .NET Framework 4.6.2 nebo novější, můžete se přihlásit k podpoře dlouhých cest přidáním následujícího postupu do <runtime>
části souboru app.config
:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=false" />
</runtime>
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6.2 |
Typ | Změna cílení |
Kontroly dvojtečky cest jsou přísnější.
Detaily
V rozhraní .NET Framework 4.6.2 bylo provedeno několik změn, které podporovaly dříve nepodporované cesty (délku i formát). Kontroly správné syntaxe oddělovače jednotek (dvojtečka) byly opraveny, což mělo vedlejší účinek blokování některých cest URI v několika vybraných rozhraních API cesty, kde byly dříve tolerovány.
Návrh
Pokud předáte identifikátor URI ovlivněným rozhraním API, nejprve upravte řetězec jako právní cestu.
Schéma odeberte z adres URL ručně (například odebrat
file://
z adres URL).Předejte identifikátor URI do Uri třídy a použijte LocalPath.
Alternativně můžete zrušit normalizaci nové cesty nastavením Switch.System.IO.UseLegacyPathHandling
přepínače AppContext na true
.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Zabezpečení
RsACng teď správně načte klíče RSA s nestandardní velikostí klíče.
Detaily
Ve verzích rozhraní .NET Framework starších než 4.6.2 nemají zákazníci s nestandardními velikostmi klíčů pro certifikáty RSA přístup k těmto klíčům prostřednictvím System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(X509Certificate2) metod rozšíření a System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2) metod rozšíření. Vyvolá System.Security.Cryptography.CryptographicException se zpráva "Požadovaná velikost klíče není podporována". V rozhraní .NET Framework 4.6.2 byl tento problém opraven. ImportParameters(RSAParameters) Podobně a ImportParameters(RSAParameters) nyní pracovat s nestandardní velikosti klíčů bez vyvolání System.Security.Cryptography.CryptographicExceptionklíče .
Návrh
Pokud existuje nějaká logika zpracování výjimek, která spoléhá na předchozí chování, kdy System.Security.Cryptography.CryptographicException se vyvolá při použití nestandardních velikostí klíčů, zvažte odebrání logiky.
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
- RSA.ImportParameters(RSAParameters)
- RSACng.ImportParameters(RSAParameters)
- RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2)
- RSACertificateExtensions.GetRSAPublicKey(X509Certificate2)
SignedXml.GetPublicKey vrátí RSACng na net462 (nebo lightupu) bez změny cílení.
Detaily
Počínaje rozhraním .NET Framework 4.6.2 se konkrétní typ objektu vráceného SignedXml.GetPublicKey metodou změnil (bezquirku) z implementace CryptoServiceProvider na implementaci Cng. Důvodem je to, že implementace se změnila z použití certificate.PublicKey.Key
na použití interního certificate.GetAnyPublicKey
, který předává RSACertificateExtensions.GetRSAPublicKey.
Návrh
Počínaje aplikacemi spuštěnými v rozhraní .NET Framework 4.7.1 můžete použít implementaci CryptoServiceProvider, která se ve výchozím nastavení používá v rozhraní .NET Framework 4.6.1 a starších verzích, a to přidáním následujícího přepínače konfigurace do části runtime konfiguračního souboru aplikace:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
WCF (Windows Communication Foundation)
Zablokování může mít za následek použití služeb Reentrant
Detaily
Zablokování může vést ke službě Reentrant, která omezuje instance služby na jedno vlákno spuštění najednou. Služby náchylné k tomuto problému budou mít v kódu následující ServiceBehaviorAttribute :
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
Návrh
Pokud chcete tento problém vyřešit, můžete udělat toto:
- Nastavte režim souběžnosti služby na ConcurrencyMode.Single hodnotu nebo ConcurrencyMode.Multiple. Příklad:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
- Nainstalujte nejnovější aktualizaci rozhraní .NET Framework 4.6.2 nebo upgradujte na novější verzi rozhraní .NET Framework. To zakáže tok ExecutionContext in OperationContext.Current. Toto chování je konfigurovatelné; je ekvivalentní přidání následujícího nastavení aplikace do konfiguračního souboru:
<appSettings>
<add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="true" />
</appSettings>
Hodnota Switch.System.ServiceModel.DisableOperationContextAsyncFlow
by nikdy neměla být nastavena na false
hodnotu služby Reentrant.
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
OperationContext.Current může vrátit hodnotu null při zavolání v klauzuli using
Detaily
OperationContext.Current může vrátit null
a může NullReferenceException vést k tomu, pokud jsou splněny všechny následující podmínky:
- Hodnotu vlastnosti načtete OperationContext.Current v metodě, která vrací Task nebo Task<TResult>.
- Vytvoří instanci objektu OperationContextScope
using
v klauzuli. - Načtete hodnotu OperationContext.Current vlastnosti v rámci objektu
using statement
. Příklad:
using (new OperationContextScope(OperationContext.Current))
{
// OperationContext.Current is null.
OperationContext context = OperationContext.Current;
// ...
}
Návrh
Pokud chcete tento problém vyřešit, můžete udělat toto:
Následujícím způsobem upravte kód tak, aby vytvořil instanci nového objektu bez
null
Current objektu:OperationContext ocx = OperationContext.Current; using (new OperationContextScope(OperationContext.Current)) { OperationContext.Current = new OperationContext(ocx.Channel); // ... }
Nainstalujte nejnovější aktualizaci rozhraní .NET Framework 4.6.2 nebo upgradujte na novější verzi rozhraní .NET Framework. To zakáže tok ExecutionContext in OperationContext.Current a obnoví chování aplikací WCF v rozhraní .NET Framework 4.6.1 a starších verzích. Toto chování je konfigurovatelné; je ekvivalentní přidání následujícího nastavení aplikace do konfiguračního souboru:
<appSettings> <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="true" /> </appSettings>
Pokud je tato změna nežádoucí a vaše aplikace závisí na toku kontextu spuštění mezi kontexty operací, můžete tok povolit následujícím způsobem:
<appSettings> <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="false" /> </appSettings>
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Zabezpečení přenosu WCF podporuje certifikáty uložené pomocí CNG
Detaily
Počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6.2, podporuje zabezpečení přenosu WCF certifikáty uložené pomocí knihovny CNG (Windows Cryptography Library). Tato podpora je omezená na certifikáty s veřejným klíčem, který má exponent déle než 32 bitů. Když aplikace cílí na rozhraní .NET Framework 4.6.2, je tato funkce ve výchozím nastavení zapnutá. V dřívějších verzích rozhraní .NET Framework vyvolá pokus o použití certifikátů X509 s poskytovatelem úložiště klíčů CSG výjimku.
Návrh
Aplikace, které cílí na rozhraní .NET Framework 4.6.1 a starší, ale běží na rozhraní .NET Framework 4.6.2, můžou povolit podporu certifikátů CNG přidáním následujícího řádku do <runtime>
části souboru app.config nebo web.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IdentityModel.DisableCngCertificates=false" />
</runtime>
Můžete to provést také programově pomocí následujícího kódu:
private const string DisableCngCertificates = @"Switch.System.IdentityModel.DisableCngCertificate";
AppContext.SetSwitch(disableCngCertificates, false);
Const DisableCngCertificates As String = "Switch.System.IdentityModel.DisableCngCertificates"
AppContext.SetSwitch(disableCngCertificates, False)
Všimněte si, že kvůli této změně se už nebude spouštět jakýkoli kód zpracování výjimek, který závisí na pokusu o zahájení zabezpečené komunikace s certifikátem CNG.
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6.2 |
Typ | Změna cílení |
Windows Forms
Nesprávná implementace MemberDescriptor.Equals
Detaily
Původní implementace MemberDescriptor.Equals metody porovnává dvě různé vlastnosti řetězce z porovnávaných objektů: název kategorie a řetězec popisu. Oprava je porovnat Category první objekt s Category druhým objektem a Description od prvního k druhému objektu Description .
Návrh
Pokud vaše aplikace někdy závisí na MemberDescriptor.Equals vrácení false
, když jsou popisovače ekvivalentní a cílíte na rozhraní .NET Framework 4.6.2 nebo novější, máte několik možností:
- Proveďte změny kódu a porovnejte Category Description pole ručně kromě volání MemberDescriptor.Equals metody.
- Odhlaste se od této změny přidáním následující hodnoty do souboru app.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=true" />
</runtime>
Pokud vaše aplikace cílí na rozhraní .NET Framework 4.6.1 nebo starší a běží na rozhraní .NET Framework 4.6.2 nebo novější a chcete tuto změnu povolit, můžete přepínač false
kompatibility nastavit tak, že do souboru app.config přidáte následující hodnotu:
<runtime>
<AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=false" />
</runtime>
Jméno | Hodnota |
---|---|
Obor | Edge |
Verze | 4.6.2 |
Typ | Změna cílení |
Ovlivněná rozhraní API
Windows Presentation Foundation (WPF)
CurrentCulture se v rámci operací dispečeru WPF nezachovává.
Detaily
Počínaje rozhraním .NET Framework 4.6 dojde ke System.Globalization.CultureInfo.CurrentCulture ztrátě změn nebo System.Globalization.CultureInfo.CurrentUICulture provedených v rámci System.Windows.Threading.Dispatcher operace dispečera. Podobně se změny nebo System.Globalization.CultureInfo.CurrentUICulture provedené System.Globalization.CultureInfo.CurrentCulture mimo operaci Dispatcher nemusí při spuštění této operace projevit. Prakticky to znamená, že System.Globalization.CultureInfo.CurrentCulture změny System.Globalization.CultureInfo.CurrentUICulture nemusí přetékat mezi zpětnými voláními uživatelského rozhraní WPF a jiným kódem v aplikaci WPF. Důvodem je změnaSystem.Threading.ExecutionContext, která způsobí System.Globalization.CultureInfo.CurrentCulture a System.Globalization.CultureInfo.CurrentUICulture uloží se v kontextu spouštění počínaje aplikacemi, které cílí na rozhraní .NET Framework 4.6. Operace dispečera WPF ukládají kontext spuštění použitý k zahájení operace a obnovení předchozího kontextu po dokončení operace. Vzhledem k tomu System.Globalization.CultureInfo.CurrentCulture , že jsou System.Globalization.CultureInfo.CurrentUICulture nyní součástí tohoto kontextu, změny v rámci operace dispečera se neuchovávají mimo operaci.
Návrh
Aplikace ovlivněné touto změnou můžou tuto změnu obejít uložením požadovaného System.Globalization.CultureInfo.CurrentCulture pole nebo System.Globalization.CultureInfo.CurrentUICulture do pole a vrácením všech kontrolních orgánů operací dispečera (včetně obslužných rutin zpětného volání událostí uživatelského rozhraní), které jsou správné System.Globalization.CultureInfo.CurrentCulture a System.Globalization.CultureInfo.CurrentUICulture nastavené. Alternativně platí, že změna ExecutionContext, která je základem této změny WPF, má vliv pouze na aplikace, které cílí na rozhraní .NET Framework 4.6 nebo novější, můžete se vyhnout tím, že cílí na rozhraní .NET Framework 4.5.2.Apps, které cílí na rozhraní .NET Framework 4.6 nebo novější, můžou tento problém obejít také nastavením následujícího přepínače kompatibility:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Tento problém vyřešil WPF v rozhraní .NET Framework 4.6.2. Byl také opraven v rozhraní .NET Frameworks 4.6, 4.6.1 až KB 3139549. Aplikace, které cílí na rozhraní .NET Framework 4.6 nebo novější, automaticky získají správné chování v aplikacích WPF – System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) se zachovají napříč operacemi Dispečera.
Jméno | Hodnota |
---|---|
Obor | Menší |
Verze | 4.6 |
Typ | Změna cílení |