Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk felsorolja azokat az alkalmazáskompatibilitási problémákat, amelyeket a .NET-keretrendszer 4.6, 4.6.1 és 4.6.2 által bevezetett.
.NET-keretrendszer 4.6
ASP.NET
A HtmlTextWriter nem jeleníti meg <br/> megfelelően az elemet
Részletek
A .NET-keretrendszer 4.6-os verziójától kezdődően a RenderBeginTag(String) és RenderEndTag() hívása a <BR /> elemmel helyesen csak egy <BR />-t szúr be (kettő helyett)
Javaslat
Ha egy alkalmazás a további <BR /> címkétől függ, RenderBeginTag(String) akkor második alkalommal kell meghívni. Vegye figyelembe, hogy ez a viselkedésváltozás csak a .NET-keretrendszer 4.6-os vagy újabb verziót célzó alkalmazásokat érinti, ezért a másik lehetőség a .NET-keretrendszer egy korábbi verziójának megcélzása a régi viselkedés elérése érdekében.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,6 |
| Típus | Újratargeting |
Érintett API-k
ClickOnce
Az SHA-256 kódaláíró tanúsítványt használó ClickOnce-nal közzétett alkalmazások sikertelenek lehetnek Windows 2003 rendszeren
Részletek
A végrehajtható fájl az SHA256-tal van aláírva. Korábban az SHA1-zel írták alá, függetlenül attól, hogy a kódaláíró tanúsítvány SHA-1 vagy SHA-256 volt-e. Ez a következőkre vonatkozik:
- A Visual Studio 2012 vagy újabb verziójával készült összes alkalmazás.
- A Visual Studio 2010-et vagy korábbi verziót tartalmazó alkalmazások a .NET-keretrendszer 4.5-ös verziójú rendszereken. Ezenkívül, ha a .NET-keretrendszer 4.5-ös vagy újabb verzió van jelen, a ClickOnce-manifesztumot SHA-256-tal is aláírják, ha SHA-256 tanúsítványok érhetők el, függetlenül attól, hogy melyik .NET-keretrendszer verzióra lett fordítva.
Javaslat
A ClickOnce végrehajtható fájl aláírásának megváltoztatása csak a Windows Server 2003 rendszereket érinti; ezek igénylik a KB 938397 telepítését. A jegyzék sha-256-tal való aláírásának módosítása akkor is, ha egy alkalmazás a .NET-keretrendszer 4.0-s vagy korábbi verzióit célozza, futtatókörnyezeti függőséget vezet be a .NET-keretrendszer 4.5-ös vagy újabb verziójára.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,5 |
| Típus | Újratargeting |
A ClickOnce támogatja az SHA-256-ot 4.0-s célalkalmazásokon
Részletek
Korábban az SHA-256-tal aláírt tanúsítvánnyal rendelkező ClickOnce-alkalmazásnak .NET-keretrendszer 4.5-ös vagy újabb verziójára lenne szükség, még akkor is, ha az alkalmazás a 4.0-s verziót célozta meg. Most .NET-keretrendszer 4.0-s célzott ClickOnce-alkalmazások akkor is futtathatók .NET-keretrendszer 4.0-n, ha sha-256-tal van aláírva.
Javaslat
Ez a módosítás eltávolítja a függőséget, és lehetővé teszi az SHA-256-tanúsítványok használatát a ClickOnce-alkalmazások aláírásához, amelyek .NET-keretrendszer 4- és korábbi verziót céloznak meg.
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Újratargeting |
Alapvető
A CurrentCulture és a CurrentUICulture átterjed a tevékenységek során
Részletek
A .NET-keretrendszer 4.6-tól kezdve a System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture tárolása a szál System.Threading.ExecutionContext-jában történik, amely folyamatosan továbbítódik az aszinkron műveleteken keresztül. Ez azt jelenti, hogy a System.Globalization.CultureInfo.CurrentCulture vagy System.Globalization.CultureInfo.CurrentUICulture módosításai megjelennek a később aszinkron módon futó feladatokban. Ez eltér a korábbi .NET-keretrendszer verziók viselkedésétől (ami alaphelyzetbe állítaná System.Globalization.CultureInfo.CurrentCulture, és System.Globalization.CultureInfo.CurrentUICulture minden aszinkron feladatban).
Javaslat
A módosítás által érintett alkalmazások a kívánt System.Globalization.CultureInfo.CurrentCulture vagy System.Globalization.CultureInfo.CurrentUICulture az aszinkron tevékenység első műveletének explicit beállításával megkerülhetik a módosítást. Másik lehetőségként a régi viselkedés (nem áramló System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) a következő kompatibilitási kapcsoló beállításával választható:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Ezt a problémát a WPF a .NET-keretrendszer 4.6.2-es verziójában javította. A 4.6-os, 4.6.1-s és KB-3139549 .NET-keretrendszer is kijavítottuk. A .NET-keretrendszer 4.6-os vagy újabb verzióját megcélzó alkalmazások automatikusan a helyes működést biztosítják a WPF-alkalmazásokban – a System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture kijelölések megmaradnak a Dispatcher műveletek során.
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Újracélzás |
Érintett API-k
- CultureInfo.CurrentCulture
- Thread.CurrentCulture
- CultureInfo.CurrentUICulture
- Thread.CurrentUICulture
Az ETW-eseménynevek nem térhetnek el csak a "Start" vagy a "Stop" utótagtól
Részletek
A .NET-keretrendszer 4.6-os és 4.6.1-es verziójában a futtatókörnyezet kivételt dob ArgumentException, amikor a Windows eseménykövetésének (ETW) két eseményneve csak a "Start" vagy "Stop" utótagban tér el (például, amikor az egyik esemény neve LogUser, a másiké pedig LogUserStart). Ebben az esetben a futtatókörnyezet nem tudja létrehozni az eseményforrást, amely nem tud naplózást kibocsátni.
Javaslat
A kivétel elkerülése érdekében győződjön meg arról, hogy egyetlen két eseménynév sem tér el csak a "Start" vagy a "Stop" utótagtól. Ez a követelmény a 4.6.2-.NET-keretrendszer kezdve megszűnik; a futtatókörnyezet csak a "Start" és a "Stop" utótaggal eltérő eseményneveket jelezheti.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,6 |
| Típus | Újracélzás |
Entity Framework
Az Entity Framework edmx Visual Studio 2013-nal való létrehozása meghiúsulhat MSB4062 hibával, ha az EntityDeploySplit vagy az EntityClean feladatokat használja
Részletek
Az MSBuild 12.0-eszközök (a Visual Studio 2013-ban) megváltoztatták az MSBuild fájlhelyeket, ami miatt a régebbi Entity Framework-célfájlok érvénytelenek. Az az eredmény, hogy a EntityDeploySplit és EntityClean feladatok sikertelenek, mert nem találják meg a Microsoft.Data.Entity.Build.Tasks.dll-t. Vegye figyelembe, hogy ez a törés egy eszközkészlet (MSBuild/VS) változása miatt van, nem pedig egy .NET-keretrendszer változás miatt. Ez csak a fejlesztői eszközök frissítésekor fordul elő, nem pedig csak a .NET-keretrendszer frissítésekor.
Javaslat
Az Entity Framework célfájljai módosítva lettek, hogy együttműködjenek az új MSBuild-elrendezéssel, amely a .NET-keretrendszer 4.6-os verziójától kezdődik. A keretrendszer erre a verziójára való frissítés megoldja ezt a problémát. Alternatív megoldásként ez a megoldás közvetlenül használható a célfájlok kijavítására.
| Név | Érték |
|---|---|
| Hatókör | Fő |
| Verzió | 4.5.1 |
| Típus | Újracélzás |
JIT
Az IL újrapróbálkozása nem engedélyezett a próbarégióban
Részletek
A JIT64 igény szerinti fordítóval ellentétben a RyuJIT (a .NET-keretrendszer 4.6-os verziójában) nem engedélyezi az IL ret utasítást a try régióban. A próbarégióból való visszatérést az ECMA-335 specifikáció nem engedélyezi, és egy ismert felügyelt fordító sem hoz létre ilyen IL-t. A JIT64 fordító azonban akkor hajtja végre az ilyen IL-t, ha azt reflexiókibocsátással hozzák létre.
Javaslat
Ha egy alkalmazás olyan IL-t hoz létre, amely egy ret opkódot tartalmaz egy próbarészben, az alkalmazás a .NET-keretrendszer 4.5-öt célozhatja meg, hogy a régi JIT-et használja, és elkerülje ezt a hibát. Másik lehetőségként a létrehozott IL frissíthető, hogy a próbarégió után visszatérjen.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,6 |
| Típus | Újracélzás |
Új 64 bites JIT-fordító a .NET-keretrendszer 4.6-ban
Részletek
A .NET-keretrendszer 4.6-ostól kezdve egy új, 64 bites JIT-fordítót használunk az igény szerinti fordításhoz. Bizonyos esetekben váratlan kivétel történik, vagy más viselkedés figyelhető meg, mint ha egy alkalmazást a 32 bites fordítóval vagy a régebbi 64 bites JIT-fordítóval futtatnak. Ez a módosítás nem érinti a 32 bites JIT-fordítót. Az ismert különbségek a következők:
- Bizonyos feltételek mellett a kicsomagolási művelet egy NullReferenceException hibát okozhat Release build esetén, ha az optimalizálás be van kapcsolva.
- Bizonyos esetekben az éles kód végrehajtása során egy nagy metódustörzsben dobhat egy StackOverflowException.
- Bizonyos feltételek mellett a metódusnak átadott struktúrákat nem értéktípusokként, hanem referenciatípusokként kezelik a kiadási buildekben. A probléma egyik megnyilvánulása, hogy a gyűjtemény egyes elemei váratlan sorrendben jelennek meg.
- Bizonyos feltételek mellett az értékek és a nagy bitkészlet összehasonlítása UInt16 helytelen, ha az optimalizálás engedélyezve van.
- Bizonyos feltételek mellett, különösen a tömbértékek inicializálása esetén az IL utasítás memória inicializálása helytelen értékkel inicializálhatja a OpCodes.Initblk memóriát. Ez nem kezelt kivételt vagy helytelen kimenetet eredményezhet.
- Bizonyos ritka körülmények között a feltételes bitteszt visszaadhatja a helytelen Boolean értéket, vagy kivételt okozhat, ha a fordítóoptimalizálás engedélyezve van.
- Bizonyos feltételek mellett, ha egy
ifutasítást egy feltétel tesztelésére használunk egytryblokkba való belépés előtt, és ugyanazt a feltételt kiértékeljük a kilépéskor atryblokkból, valamint acatchvagy afinallyblokkban, az új 64 bites JIT-fordító optimalizálás közben eltávolítja aiffeltételt acatchvagyfinallyblokkból. Ennek eredményeképpen a rendszer feltétel nélkül végrehajtja azifutasításban vagycatchblokkbanfinallylévő kódot.
Javaslat
Ismert problémák elhárítása
Ha a fent felsorolt problémákat tapasztalja, az alábbiak bármelyikével elháríthatja őket:
Frissítsen a .NET-keretrendszer 4.6.2-re. A .NET-keretrendszer 4.6.2-ben található új 64 bites fordító az ismert problémák mindegyikét kezeli.
A Windows Update futtatásával győződjön meg arról, hogy a Windows verziója naprakész. A .NET keretrendszer 4.6 és 4.6.1 szolgáltatásfrissítései minden problémát kezelnek, kivéve a NullReferenceException kicsomagolási műveletet.
Fordítás a régebbi, 64 bites JIT-fordítóval. Ennek módjáról további információt az egyéb problémák elhárítása című szakaszban talál. Egyéb problémák elhárítása
Ha a régebbi 64 bites fordítóval és az új 64 bites JIT-fordítóval lefordított kód, illetve az új 64 bites JIT-fordítóval lefordított alkalmazás hibakeresési és kiadási verziói között bármilyen más eltérést tapasztal, az alábbiakat követve fordíthatja le az alkalmazást a régebbi 64 bites JIT-fordítóval:Alkalmazásonként hozzáadhatja az elemet az < alkalmazás konfigurációs fájljához. A következő letiltja a fordítást az új 64 bites JIT-fordítóval, és ehelyett az örökölt 64 bites JIT-fordítót használja.
<?xml version ="1.0"?> <configuration> <runtime> <useLegacyJit enabled="1" /> </runtime> </configuration>Felhasználónként hozzáadhat egy
HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFrameworkértéket, amelyetuseLegacyJitnéven aREG_DWORDkulcshoz a beállításjegyzékben. Az 1 érték lehetővé teszi az örökölt 64 bites JIT-fordítót; a 0 érték letiltja, és engedélyezi az új 64 bites JIT-fordítót.Gépenként hozzáadhat egy
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFrameworkértéket auseLegacyJitbeállításjegyzék kulcsáhozREG_DWORDnéven. Egy érték1lehetővé teszi az örökölt 64 bites JIT-fordítót; egy érték0letiltja azt, és engedélyezi az új 64 bites JIT-fordítót. A problémáról úgy is tudathatja velünk, ha hibajelentést küld a Microsoft Connect szolgáltatásra.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,6 |
| Típus | Újracélzás |
hálózat
EKU OID tanúsítvány érvényesítése
Részletek
A .NET-keretrendszer 4.6-os verziójától kezdve az SslStream vagy ServicePointManager osztályok továbbfejlesztett kulcshasználati (EKU) objektumazonosító (OID) érvényesítést hajtanak végre. A továbbfejlesztett kulcshasználati (EKU) bővítmény objektumazonosítók (OID-k) gyűjteménye, amelyek a kulcsot használó alkalmazásokat jelzik. Az EKU OID érvényesítése távoli tanúsítványvisszahívásokkal biztosítja, hogy a távoli tanúsítvány a megfelelő OID-kkel rendelkezzen a kívánt célra.
Javaslat
Ha ez a módosítás nem kívánatos, letilthatja a tanúsítvány EKU OID-ellenőrzését úgy, hogy hozzáadja az alábbi kapcsolót az <AppContextSwitchOverrideshez> az ` alkalmazáskonfigurációs fájlban:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontCheckCertificateEKUs=true" />
</runtime>
Fontos
Ez a beállítás csak a visszamenőleges kompatibilitás érdekében van megadva. Használata egyébként nem ajánlott.
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Újracélzás |
Érintett API-k
- System.Net.Security.SslStream
- System.Net.ServicePointManager
- System.Net.Http.HttpClient
- System.Net.Mail.SmtpClient
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
Csak a System.Net.ServicePointManagerben és a System.Net.Security.SslStreamben támogatott Tls 1.0-s, 1.1-s és 1.2-s protokollok támogatottak
Részletek
A .NET-keretrendszer 4.6-os verziójától kezdve az ServicePointManager osztályok csak SslStream a következő három protokoll egyikét használhatják: Tls1.0, Tls1.1 vagy Tls1.2. Az SSL3.0 protokoll és az RC4 titkosítás nem támogatott.
Javaslat
A javasolt kockázatcsökkentés az, ha a féloldali alkalmazást Tls1.0, Tls1.1 vagy Tls1.2 verzióra frissíti. Ha ez nem kivitelezhető, vagy ha az ügyfélalkalmazások meghibásodnak, az System.AppContext osztály két módon is letiltható a szolgáltatásból:
- Ha programozott módon állítja be a compat kapcsolókat a System.AppContext2015-ös build .NET-közleményeiben leírtak szerint.
- Ha hozzáadja a következő sort az
<runtime>app.config fájl szakaszához:
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Újracélzás |
Érintett API-k
A TLS 1.x alapértelmezés szerint átadja a SCH_SEND_AUX_RECORD jelzőt a mögöttes SCHANNEL API-nak
Részletek
A TLS 1.x használatakor a .NET-keretrendszer a mögöttes Windows SCHANNEL API-ra támaszkodik. A .NET-keretrendszer 4.6-ostól kezdve a SCH_SEND_AUX_RECORD jelző alapértelmezés szerint át lesz adva az SCHANNEL-nek. Ez azt eredményezi, hogy az SCHANNEL két külön rekordra osztja fel az adatokat, az elsőt egyetlen bájtra, a másodikat pedig n-1 bájtra. Ritkán ez megszakítja az ügyfelek és a meglévő kiszolgálók közötti kommunikációt, amelyek feltételezik, hogy az adatok egyetlen rekordban találhatók.
Javaslat
Ha ez a módosítás megszakítja a meglévő kiszolgálóval való kommunikációt, letilthatja a SCH_SEND_AUX_RECORD jelző küldését, és visszaállíthatja az adatok külön rekordokra való felosztásának korábbi viselkedését az alábbi kapcsoló hozzáadásával az <AppContextSwitchOverrides><runtime> alkalmazáskonfigurációs fájl szakaszának eleméhez:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchSendAuxRecord=true" />
</runtime>
Fontos
Ez a beállítás csak a visszamenőleges kompatibilitás érdekében van megadva. Használata egyébként nem ajánlott.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,6 |
| Típus | Újracélzás |
Érintett API-k
- 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)
Módosult a CreateDefaultAuthorizationContext meghívása null argumentummal
Részletek
A System.IdentityModel.Policy.AuthorizationContext.CreateDefaultAuthorizationContext(IList<IAuthorizationPolicy>) hívása, amelynek az authorizationPolicies argumentuma null, a .NET-keretrendszer 4.6-os verziójában megváltoztatta a System.IdentityModel.Policy.AuthorizationContext végrehajtását.
Javaslat
Ritkán előfordulhat, hogy az egyéni hitelesítést használó WCF-alkalmazások viselkedésbeli különbségeket tapasztalnak. Ilyen esetekben az előző viselkedés kétféleképpen állítható vissza:
Fordítsa újra az alkalmazását a .NET-keretrendszer egy 4.6-nál korábbi verziójának megcélzásához. Az IIS által üzemeltetett szolgáltatások esetében használja az elemet a
<httpRuntime targetFramework="x.x">.NET-keretrendszer egy korábbi verziójának megcélzásához.Adja hozzá a következő sort az
<appSettings>app.config fájl szakaszához:<add key="appContext.SetSwitch:Switch.System.IdentityModel.EnableCachedEmptyDefaultAuthorizationContext" value="true" />
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Újracélzás |
Érintett API-k
Windows Forms
Az Icon.ToBitmap sikeresen konvertálja a PNG-keretekkel rendelkező ikonokat Bitmap-objektumokká
Részletek
A .NET-keretrendszer 4.6-ot megcélzó alkalmazásoktól kezdve a metódus sikeresen konvertálja a Icon.ToBitmap PNG-keretekkel rendelkező ikonokat Bitmap-objektumokká.
A .NET-keretrendszer 4.5.2-s és korábbi verzióit megcélzó alkalmazásokban a Icon.ToBitmap metódus kivételt ArgumentOutOfRangeException eredményez, ha az Icon objektum PNG-keretekkel rendelkezik.
Ez a változtatás azokat az alkalmazásokat érinti, amelyeket a .NET-keretrendszer 4.6-ra újrafordítottak, és amelyek különleges kezelést valósítanak meg a ArgumentOutOfRangeException kivétellel kapcsolatban, amely az ikonobjektumok PNG-kereteinél jelentkezik. Ha a program a .NET-keretrendszer 4.6 alatt fut, az átalakítás sikeres, így a ArgumentOutOfRangeException már nem váltódik ki, ezért a kivételkezelő sem lesz meghívva.
Javaslat
Ha ez a viselkedés nem kívánatos, megtarthatja az előző viselkedést úgy, hogy hozzáadja az alábbi elemet az <runtime> app.config fájl szakaszához:
<AppContextSwitchOverrides
value="Switch.System.Drawing.DontSupportPngFramesInIcons=true" />
Ha az app.config fájl már tartalmazza az AppContextSwitchOverrides elemet, az új értéket egyesíteni kell az alábbi értékattribútummal:
<AppContextSwitchOverrides
value="Switch.System.Drawing.DontSupportPngFramesInIcons=true;<previous key>=<previous value>" />
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Újracélzás |
Érintett API-k
Windows Presentation Foundation (WPF)
A CurrentCulture nem marad meg a WPF-ütemező műveletek között
Részletek
A .NET-keretrendszer 4.6-os verziójától kezdve a System.Globalization.CultureInfo.CurrentCulture vagy a System.Globalization.CultureInfo.CurrentUICulture módosításai, amelyeket a System.Windows.Threading.Dispatcher belül hajtanak végre, elvesznek a diszpécser művelet végén. Hasonlóképpen előfordulhat, hogy a System.Globalization.CultureInfo.CurrentCulture diszpécserművelet vagy a System.Globalization.CultureInfo.CurrentUICulture kívül végzett módosítások nem jelennek meg a művelet végrehajtásakor. Gyakorlatilag ez azt jelenti, hogy a System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture közötti változások nem biztos, hogy áramlanak a WPF felhasználói felületi visszahívások és egyéb WPF-alkalmazási kódok között. Ennek oka, hogy a System.Threading.ExecutionContext-ben bekövetkezett változás miatt System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture a végrehajtási környezetben kerül tárolásra a .NET-keretrendszer 4.6-os verzióját célzó alkalmazásokban. A WPF-diszpécserműveletek a művelet megkezdéséhez használt végrehajtási környezetet tárolják, és a művelet befejezésekor visszaállítják az előző környezetet. System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture most már a környezet részét képezik, így a diszpécserműveleten belüli módosítások nem maradnak meg a műveleten kívül.
Javaslat
A változás által érintett alkalmazások megkerülhetik ezt azzal, hogy a kívánt System.Globalization.CultureInfo.CurrentCulture vagy System.Globalization.CultureInfo.CurrentUICulture egy mezőbe tárolják, és minden Dispatcher-műveleti törzsben (beleértve a felhasználói felület esemény-visszahívási kezelőit is) ellenőrzik, hogy a megfelelő System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture be vannak állítva. Alternatív megoldásként, mivel a WPF-változás alapjául szolgáló ExecutionContext-módosítás csak a .NET-keretrendszer 4.6-os vagy újabb verziót célzó alkalmazásokat érinti, ez a törés elkerülhető a .NET-keretrendszer 4.5.2.-.NET-keretrendszer 4.6-os vagy újabb verziót célzó alkalmazások esetében is, ha a következő kompatibilitási kapcsolót állítja be:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Ezt a problémát a WPF a .NET-keretrendszer 4.6.2-es verziójában javította. A 4.6-os, 4.6.1-s és KB-3139549 .NET-keretrendszer is kijavítottuk. A .NET-keretrendszer 4.6-os vagy újabb verzióját megcélzó alkalmazások automatikusan a helyes működést biztosítják a WPF-alkalmazásokban – a System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture kijelölések megmaradnak a Dispatcher műveletek során.
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Újratargeting |
A WPF-elrendezésben a margók kerekítése megváltozott
Részletek
A margók lekerekítésének módja, a szegélyek és a bennük lévő háttér megváltozott. A változás eredményeként:
- Az elemek szélessége vagy magassága legfeljebb egy képponttal nőhet vagy csökkenhet.
- Egy objektum elhelyezése legfeljebb egy képponttal mozgatható.
- A középre igazított elemek legfeljebb egy képponttal eltérhetnek a középponttól függőlegesen vagy vízszintesen. Alapértelmezés szerint ez az új elrendezés csak a .NET-keretrendszer 4.6-ot célzó alkalmazások esetében engedélyezett.
Javaslat
Mivel ez a módosítás általában megszünteti a WPF-vezérlők jobb vagy alsó részének kivágását a magas DPI-knél, a .NET-keretrendszer korábbi verzióit célzó, de a .NET-keretrendszer 4.6-on futó alkalmazások az alábbi sor hozzáadásával engedélyezhetik ezt az új viselkedést az app.config fájl szakaszához<runtime>:
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=false" />
Azok az alkalmazások, amelyek a .NET-keretrendszer 4.6-ot célozzák meg, de szeretnék, ha a WPF-vezérlők az előző elrendezési algoritmussal jelenjenek meg, ezt megtehetik, ha az alábbi sort hozzáadják az app.config fájl <runtime> szakaszában:
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=true" />
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Célközönség újra-megkeresése |
XML, XSLT
XmlWriter kivételt dob érvénytelen helyettesítő párok esetén
Részletek
A .NET-keretrendszer 4.5.2-es vagy korábbi verziót megcélzott alkalmazások esetében a kivétel-tartalékkezelést használó érvénytelen helyettesítő párok írása nem mindig okoz kivételt. A .NET-keretrendszer 4.6-ot megcélzó alkalmazások esetében érvénytelen helyettesítő pár írására tett kísérlet egy System.ArgumentException.
Javaslat
Szükség esetén ez a törés elkerülhető a .NET-keretrendszer 4.5.2 vagy korábbi verziójának megcélzásával. Másik lehetőségként az érvénytelen helyettesítő párok írásuk előtt előre feldolgozhatók érvényes XML-fájlba.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,6 |
| Típus | Újratargeting |
Érintett API-k
- 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)
Az XSD-séma érvényesítése mostantól helyesen észleli az egyedi korlátozások megsértését összetett kulcsok használata esetén, és egy kulcs üres
Részletek
A .NET-keretrendszer 4.6 előtti verzióiban hiba lépett fel, amely miatt az XSD-ellenőrzés nem észlelt egyedi korlátozásokat az összetett kulcsokon, ha az egyik kulcs üres volt. A 4.6-os .NET-keretrendszer ez a probléma ki van javítva. Ez helyesebb érvényesítést eredményez, de előfordulhat, hogy bizonyos XML nem érvényesíti azokat, amelyek korábban már előfordultak volna.
Javaslat
Ha lazább .NET-keretrendszer 4.0-s érvényesítésre van szükség, az érvényesítő alkalmazás a .NET-keretrendszer 4.5-ös (vagy korábbi) verzióját célozhatja meg. Amikor a .NET keretrendszer 4.6-os verziójára történik az újracélzás, azonban a kódellenőrzést el kell végezni annak biztosítására, hogy a probléma leírásában szereplő duplikált összetett kulcsokat nem kívánják érvényesíteni.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,6 |
| Típus | Újracélzás |
.NET-keretrendszer 4.6.1-es verziója
Alapvető
Útvonalelválasztó karakter módosítása a ZipArchiveEntry objektumok FullName tulajdonságában
Részletek
A .NET-keretrendszer 4.6.1-es és újabb verzióit célzó alkalmazásoknál az elérési út elválasztó karaktere visszaper ("\") helyett perjel ("/") lett a FullName tulajdonságában a ZipArchiveEntry objektumoknak, amelyeket a CreateFromDirectory metódus túlterheléseivel hoztak létre. A változás a .NET-implementációt a .ZIP fájlformátum specifikációjának 4.4.17.1 szakaszával összhangban hozza létre, és lehetővé teszi .ZIP archívumok tömörítését a nem Windows rendszerű rendszereken.
Az alkalmazás által létrehozott zip-fájl kibontása, amely a .NET-keretrendszer egy korábbi verzióját célozza nem Windows rendszerű operációs rendszereken, például a Macintosh rendszeren, nem tudja megőrizni a címtárstruktúrát. A Macintoshon például létrehoz egy fájlkészletet, amelynek fájlneve összefűzi a könyvtár elérési útját, valamint a fordított perjel ("\") karaktereket és a fájlnevet. Ennek eredményeképpen a tömörített fájlok könyvtárszerkezete nem marad meg.
Javaslat
Ennek a változásnak a windowsos operációs rendszeren az API-k által a .NET-keretrendszer System.IO névtérben tömörített .ZIP fájlokra gyakorolt hatása minimális, mivel ezek az API-k zökkenőmentesen kezelhetik a perjelet ("/") vagy a fordított perjelet ("\") elérési útelválasztó karakterként.
Ha ez a módosítás nem kívánatos, letilthatja azt úgy, hogy hozzáad egy konfigurációs beállítást az <runtime> alkalmazáskonfigurációs fájl szakaszához. Az alábbi példa mutatja mind a <runtime> szakaszt, mind az Switch.System.IO.Compression.ZipFile.UseBackslash opt-out kapcsolót:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=true" />
</runtime>
Emellett azok az alkalmazások, amelyek a .NET-keretrendszer korábbi verzióit célják, de a .NET-keretrendszer 4.6.1-es és újabb verzióiban futnak, az alkalmazáskonfigurációs <runtime> fájl szakaszához hozzáadva engedélyezhetik ezt a viselkedést. Az alábbiakban a <runtime> szakasz és a Switch.System.IO.Compression.ZipFile.UseBackslash opt-in kapcsoló is látható.
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=false" />
</runtime>
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.1 |
| Típus | Újratargeting |
Érintett API-k
- ZipFile.CreateFromDirectory(String, String)
- ZipFile.CreateFromDirectory(String, String, CompressionLevel, Boolean)
- ZipFile.CreateFromDirectory(String, String, CompressionLevel, Boolean, Encoding)
Windows Communication Foundation (WCF)
WCF-kötés a TransportWithMessageCredential biztonsági móddal
Részletek
A .NET-keretrendszer 4.6.1-től kezdődően a TransportWithMessageCredential biztonsági módot használó WCF-kötés beállítható úgy, hogy az aszimmetrikus biztonsági kulcsok alá nem írt "to" fejlécekkel rendelkező üzeneteket fogadjon. Alapértelmezés szerint a nem aláírt "to" fejlécek továbbra is el lesznek utasítva a .NET-keretrendszer 4.6.1-ben. Ezek csak akkor lesznek elfogadva, ha egy alkalmazás a Switch.System.ServiceModel.AllowUnsignedToHeader konfigurációs kapcsolóval engedélyezi ezt az új üzemmódot.
Javaslat
Mivel ez egy bejelentkezési funkció, nem befolyásolhatja a meglévő alkalmazások viselkedését.
Az új viselkedés használatának ellenőrzéséhez használja a következő konfigurációs beállítást:
<runtime>
<AppContextSwitchOverrides value="Switch.System.ServiceModel.AllowUnsignedToHeader=true" />
</runtime>
| Név | Érték |
|---|---|
| Hatókör | Átlátható |
| Verzió | 4.6.1 |
| Típus | Újratargeting |
Érintett API-k
- BasicHttpSecurityMode.TransportWithMessageCredential
- BasicHttpsSecurityMode.TransportWithMessageCredential
- SecurityMode.TransportWithMessageCredential
- WSFederationHttpSecurityMode.TransportWithMessageCredential
X509CertificateClaimSet.FindClaims Az összes jogcímtípust figyelembe veszi
Részletek
A .NET-keretrendszer 4.6.1-et megcélzott alkalmazásokban, ha egy X509-jogcímkészlet inicializálva van egy olyan tanúsítványból, amelynek a SAN-mezőjében több DNS-bejegyzés található, a System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(String, String) metódus megpróbálja egyezni a claimType argumentummal az összes DNS-bejegyzéssel. A .NET-keretrendszer korábbi verzióit célzó alkalmazások esetében a System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(String, String) metódus csak az utolsó DNS-bejegyzéssel próbál megegyezni a claimType argumentummal.
Javaslat
Ez a módosítás csak a .NET-keretrendszer 4.6.1-et célzó alkalmazásokat érinti. Ez a módosítás a DisableMultipleDNSEntries kompatibilitási kapcsolóval letiltható (vagy engedélyezhető, ha a 4.6.1 előtti célértéket célozza).
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4.6.1 |
| Típus | Újracélzás |
Érintett API-k
Windows Forms
Az Application.FilterMessage többé nem dob kivételt az IMessageFilter.PreFilterMessage rekurzív megvalósításai esetén
Részletek
A .NET-keretrendszer 4.6.1 előtt a FilterMessage(Message) meghívása PreFilterMessage(Message)-vel, amely meg is hívta a System.Windows.Forms.Application.AddMessageFilter(IMessageFilter)-t vagy System.Windows.Forms.Application.RemoveMessageFilter(IMessageFilter)-t (miközben a DoEvents()-t is hívta), egy System.IndexOutOfRangeException-t okozott.
A .NET-keretrendszer 4.6.1-et célzó alkalmazásoktól kezdve ez a kivétel már nem jelentkezik, és a fent leírt újrabehozott szűrők használhatók.
Javaslat
Ne feledje, hogy FilterMessage(Message) a továbbiakban nem fog dobni a fent leírt újrakezdő PreFilterMessage(Message) viselkedésre. Ez csak a .NET-keretrendszer 4.6.1-et megcélzó alkalmazásokat érinti. Azok az alkalmazások, amelyek a .NET-keretrendszer 4.6.1-et célozzák meg, a DontSupportReentrantFilterMessage kompatibilitási kapcsolóval kikapcsolhatják ezt a módosítást (vagy a régebbi keretrendszereket célzó alkalmazások is aktiválhatják).
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.1 |
| Típus | Újracélzás |
Érintett API-k
Windows Presentation Foundation (WPF)
A System.Windows.Input.PenContext.Disable hívásai érintésérzékeny rendszereken ArgumentException kivételt okozhatnak.
Részletek
Bizonyos körülmények között előfordulhat, hogy a belső System.Windows.Intput.PenContext.Disable metódus érintéssel kompatibilis rendszereken történő hívásai az újraküldés miatt nem kezelt T:System.ArgumentException állapotba kerülnek.
Javaslat
Ezt a problémát a .NET-keretrendszer 4.7-ben hárítottuk el. A kivétel elkerülése érdekében frissítsen a .NET-keretrendszer egy verziójára a .NET-keretrendszer 4.7-es verziójától kezdve.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.1 |
| Típus | Újracélzás |
.NET-keretrendszer 4.6.2
ASP.NET
HttpRuntime.AppDomainAppPath NullReferenceException kivételt dob
Részletek
A .NET-keretrendszer 4.6.2-ben a futtatókörnyezet egy T:System.NullReferenceException-t dob, amikor egy P:System.Web.HttpRuntime.AppDomainAppPath értéket olvas be, amely null karaktereket tartalmaz. A .NET-keretrendszer 4.6.1 és korábbi verzióiban a futtatókörnyezet egy T:System.ArgumentNullException-t dob.
Javaslat
A módosításra az alábbiak bármelyikével válaszolhat:
- Kezelje a
T:System.NullReferenceExceptionelemet, ha az alkalmazása a .NET-keretrendszer 4.6.2-n fut. - Frissítsen a .NET Framework 4.7 verzióra, amely visszaállítja az előző viselkedést, és kivételt dob egy
T:System.ArgumentNullException.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
Érintett API-k
Alapvető
Az AesCryptoServiceProvider visszafejtése újrafelhasználható átalakítást biztosít
Részletek
A .NET-keretrendszer 4.6.2-t célzó alkalmazásoktól kezdve a AesCryptoServiceProvider visszafejtő újrahasználható átalakítást biztosít. A System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32) hívás után az átalakítás újrainicializálódik, és ismét felhasználható. A .NET-keretrendszer korábbi verzióit megcélzó alkalmazásoknál, ha System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32)-t követően meghívja System.Security.Cryptography.CryptoAPITransform.TransformBlock(Byte[], Int32, Int32, Byte[], Int32)-t azzal a céllal, hogy ismételten használja a visszafejtőt, CryptographicException hibát dob, vagy sérült adatokat hoz létre.
Javaslat
Ennek a változásnak minimálisnak kell lennie, mivel ez a várt viselkedés. Az előző viselkedéstől függő alkalmazások az alábbi konfigurációs beállítás <runtime> hozzáadásával letilthatják azt az alkalmazás konfigurációs fájljának szakaszához:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.AesCryptoServiceProvider.DontCorrectlyResetDecryptor=true"/>
</runtime>
Ezenkívül azok az alkalmazások, amelyek a .NET Framework egy korábbi verzióját célozzák meg, de a .NET Framework 4.6.2 verziótól kezdve futnak, dönthetnek úgy, hogy engedélyezik, ha a következő konfigurációs beállítást hozzáadják az alkalmazás konfigurációs fájljának <runtime> szakaszához:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.AesCryptoServiceProvider.DontCorrectlyResetDecryptor=false"/>
</runtime>
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4.6.2 |
| Típus | Újratargeting |
Érintett API-k
A ClaimsIdentity konstruktoraihoz intézett hívások
Részletek
A .NET-keretrendszer 4.6.2 verziójától kezdve megváltozik, ahogy a ClaimsIdentity konstruktorok egy System.Security.Principal.IIdentity paraméterrel beállítják a System.Security.Claims.ClaimsIdentity.Actor tulajdonságot. Ha az System.Security.Principal.IIdentity argumentum egy ClaimsIdentity objektum, és az System.Security.Claims.ClaimsIdentity.Actor objektum tulajdonsága ClaimsIdentity nem null, a System.Security.Claims.ClaimsIdentity.Actor tulajdonság a metódussal Clone() lesz csatolva. A Framework 4.6.1 és korábbi verzióiban a System.Security.Claims.ClaimsIdentity.Actor tulajdonság meglévő hivatkozásként van csatolva. A változás miatt a 4.6.2 .NET-keretrendszer kezdve az System.Security.Claims.ClaimsIdentity.Actor új ClaimsIdentity objektum tulajdonsága nem egyenlő a System.Security.Claims.ClaimsIdentity.Actor konstruktor argumentumának tulajdonságávalSystem.Security.Principal.IIdentity. A .NET-keretrendszer 4.6.1-ben és a korábbi verziókban ez egyenlő.
Javaslat
Ha ez a viselkedés nem kívánatos, visszaállíthatja az előző viselkedést az alkalmazáskonfigurációs fájl Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentitykapcsolójának beállításávaltrue. Ehhez hozzá kell adnia a következőket a <runtime> web.config fájl szakaszához:
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentity=true" />
</runtime>
</configuration>
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
Érintett API-k
- ClaimsIdentity(IIdentity)
- ClaimsIdentity(IIdentity, IEnumerable<Claim>)
- ClaimsIdentity(IIdentity, IEnumerable<Claim>, String, String, String)
Az elérési út normalizálásának változásai
Részletek
A .NET-keretrendszer 4.6.2-t célzó alkalmazásoktól kezdve a futtatókörnyezet normalizálásának módja megváltozott. Az elérési út normalizálásához módosítani kell az elérési utat vagy fájlt azonosító sztringet, hogy az megfeleljen a cél operációs rendszer érvényes elérési útjának. A normalizálás általában a következőket foglalja magában:
- Az összetevők és könyvtárelválasztók kanonizálása.
- Az aktuális könyvtár alkalmazása egy relatív elérési útra.
- A relatív könyvtár (.) vagy a szülőkönyvtár (..) kiértékelése egy elérési úton.
- Megadott karakterek levágása.
A 4.6.2-.NET-keretrendszer megcélzott alkalmazásoktól kezdve alapértelmezés szerint a következő változások engedélyezve vannak az elérési út normalizálásában:
- A futtatókörnyezet az operációs rendszer GetFullPathName függvényére bízza az elérési utak normalizálását.
- A normalizálás mostantól nem foglalja magában a könyvtárszegmensek végének levágását (például szóköz a könyvtárnév végén).
- Az eszközútvonal szintaxisának támogatása teljes megbízhatóságban, beleértve
\\.\a mscorlib.dll fájl I/O API-jait is.\\?\ - A futtatókörnyezet nem ellenőrzi az eszközszyntax elérési útvonalait.
- Támogatott az eszközszintaxis használata a másodlagos adatfolyamokhoz való hozzáféréshez. Ezek a módosítások javítják a teljesítményt, miközben lehetővé teszik a metódusok számára a korábban elérhetetlen útvonalak elérését. A módosítás nem érinti azokat az alkalmazásokat, amelyek a .NET-keretrendszer 4.6.1 vagy korábbi verzióját célozzák meg, de a .NET-keretrendszer 4.6.2 vagy újabb verziójában futnak.
Javaslat
A .NET-keretrendszer 4.6.2-es vagy újabb verzióját megcélzott alkalmazások kikapcsolhatják ezt a módosítást, és régi normalizálást használhatnak az alkalmazáskonfigurációs <runtime> fájl következő szakaszához való hozzáadásával:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true" />
</runtime>
Azok az alkalmazások, amelyek a .NET-keretrendszer 4.6.1-es vagy korábbi verzióját célozzák, de a .NET-keretrendszer 4.6.2-es vagy újabb verzióján futnak, engedélyezhetik az útvonal normalizálásának változásait úgy, hogy hozzáadják az alábbi sort az alkalmazás .configuration fájljának a <runtime> szakaszához:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4.6.2 |
| Típus | Újratargeting |
CurrentCulture és CurrentUICulture áramlása a feladatok között
Részletek
A .NET-keretrendszer 4.6-tól kezdve a System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture tárolása a szál System.Threading.ExecutionContext-jában történik, amely folyamatosan továbbítódik az aszinkron műveleteken keresztül. Ez azt jelenti, hogy a System.Globalization.CultureInfo.CurrentCulture vagy System.Globalization.CultureInfo.CurrentUICulture módosításai megjelennek a később aszinkron módon futó feladatokban. Ez eltér a korábbi .NET-keretrendszer verziók viselkedésétől (ami alaphelyzetbe állítaná System.Globalization.CultureInfo.CurrentCulture, és System.Globalization.CultureInfo.CurrentUICulture minden aszinkron feladatban).
Javaslat
A módosítás által érintett alkalmazások a kívánt System.Globalization.CultureInfo.CurrentCulture vagy System.Globalization.CultureInfo.CurrentUICulture az aszinkron tevékenység első műveletének explicit beállításával megkerülhetik a módosítást. Másik lehetőségként a régi viselkedés (nem áramló System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture) a következő kompatibilitási kapcsoló beállításával választható:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
Ezt a problémát a WPF a .NET-keretrendszer 4.6.2-es verziójában javította. A 4.6-os, 4.6.1-s és KB-3139549 .NET-keretrendszer is kijavítottuk. A .NET-keretrendszer 4.6-os vagy újabb verzióját megcélzó alkalmazások automatikusan a helyes működést biztosítják a WPF-alkalmazásokban – a System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulture kijelölések megmaradnak a Dispatcher műveletek során.
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Újracélzás |
Érintett API-k
- CultureInfo.CurrentCulture
- Thread.CurrentCulture
- CultureInfo.CurrentUICulture
- Thread.CurrentUICulture
Az ETW-eseménynevek nem térhetnek el csak a "Start" vagy a "Stop" utótagtól
Részletek
A .NET-keretrendszer 4.6-os és 4.6.1-es verziójában a futtatókörnyezet kivételt dob ArgumentException, amikor a Windows eseménykövetésének (ETW) két eseményneve csak a "Start" vagy "Stop" utótagban tér el (például, amikor az egyik esemény neve LogUser, a másiké pedig LogUserStart). Ebben az esetben a futtatókörnyezet nem tudja létrehozni az eseményforrást, amely nem tud naplózást kibocsátni.
Javaslat
A kivétel elkerülése érdekében győződjön meg arról, hogy egyetlen két eseménynév sem tér el csak a "Start" vagy a "Stop" utótagtól. Ez a követelmény a 4.6.2-.NET-keretrendszer kezdve megszűnik; a futtatókörnyezet csak a "Start" és a "Stop" utótaggal eltérő eseményneveket jelezheti.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4,6 |
| Típus | Újracélzás |
Hosszú út támogatása
Részletek
A 4.6.2-.NET-keretrendszer megcélzott alkalmazásoktól kezdve a hosszú (legfeljebb 32 000 karakter hosszúságú) elérési utak támogatottak, és a 260 karakteres (vagy MAX_PATH) elérési utak hosszára vonatkozó korlátozás el lett távolítva. A .NET-keretrendszer 4.6.2-re újrafordított alkalmazások esetében a korábban a 260 karakternél hosszabb elérési út miatt korábban elvetett System.IO.PathTooLongException kódútvonalak mostantól csak a következő feltételek mellett jelennek megSystem.IO.PathTooLongException:
- Az elérési út hossza nagyobb, mint MaxValue (32 767) karakter.
- Az operációs rendszer
COR_E_PATHTOOLONGvagy annak megfelelőjét adja vissza. A .NET-keretrendszer 4.6.1-et és korábbi verziót megcélzott alkalmazások esetében a futtatókörnyezet automatikusan eldob egy System.IO.PathTooLongException 260 karakternél hosszabb elérési utat.
Javaslat
A 4.6.2-es .NET-keretrendszer megcélzott alkalmazások esetében kikapcsolhatja a hosszú elérési út támogatását, ha ez nem kívánatos, ha hozzáadja az alábbiakat a <runtime> fájl szakaszáhozapp.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=true" />
</runtime>
A .NET-keretrendszer korábbi verzióira tervezett, de a .NET-keretrendszer 4.6.2-es vagy újabb verzióján futó alkalmazások esetében a hosszú elérési utak támogatását az alábbiak <runtime> szakaszának hozzáadásával engedélyezheti az app.config fájlban:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=false" />
</runtime>
| Név | Érték |
|---|---|
| Hatókör | Kisebb |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
A kettőspont-ellenőrzés az elérési útvonalakon szigorúbb.
Részletek
A .NET-keretrendszer 4.6.2-ben számos módosítás történt a korábban nem támogatott útvonalak támogatásához (hosszban és formátumban is). A meghajtóelválasztó (kettőspont) szintaxis ellenőrzése helyesebben történt, ami azzal a mellékhatással járt, hogy néhány URI-útvonal blokkolódott bizonyos Path API-kban, ahol azokat korábban még elfogadták.
Javaslat
Ha egy URI-t ad át az érintett API-knak, először módosítsa a karakterláncot, hogy az érvényes elérési út legyen.
Távolítsa el manuálisan a sémát az URL-címekről (például távolítsa el
file://az URL-címekről).
Másik lehetőségként az AppContext kapcsoló Switch.System.IO.UseLegacyPathHandlingbeállításával true kikapcsolhatja az új elérési út normalizálását.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
Érintett API-k
Biztonság
Az RSACng most már megfelelően betölti a nem standard méretű RSA-kulcsokat
Részletek
A 4.6.2 előtti .NET-keretrendszer verziókban az RSA-tanúsítványokhoz nem szabványos kulcsmérettel rendelkező ügyfelek nem férhetnek hozzá ezekhez a kulcsokhoz a System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(X509Certificate2)System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2) bővítménymetelyeken keresztül. Ekkor System.Security.Cryptography.CryptographicException dobódik a "A kért kulcsméret nem támogatott" üzenet. A .NET-keretrendszer 4.6.2-ben ez a probléma ki lett javítva. Hasonlóképpen, ImportParameters(RSAParameters) és ImportParameters(RSAParameters) most már nem szabványos kulcsméretekkel is dolgozik anélkül, hogy egy System.Security.Cryptography.CryptographicException-t dobna.
Javaslat
Ha van olyan kivételkezelési logika, amely az előző viselkedésre támaszkodik, és akkor dobódik ki egy System.Security.Cryptography.CryptographicException kivétel, amikor nem szokványos kulcsméreteket használnak, fontolja meg a logika eltávolítását.
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
Érintett API-k
- RSA.ImportParameters(RSAParameters)
- RSACng.ImportParameters(RSAParameters)
- RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2)
- RSACertificateExtensions.GetRSAPublicKey(X509Certificate2)
A SignedXml.GetPublicKey az RSACng értéket ad vissza net462-en (vagy lightup), anélkül, hogy megváltoztatná a célzást.
Részletek
A .NET-keretrendszer 4.6.2-es verziójától kezdve a metódus által SignedXml.GetPublicKey visszaadott objektum konkrét típusa a CryptoServiceProvider implementációról Cng-implementációra változott (nem volt változás). Ennek az az oka, hogy az implementáció a certificate.PublicKey.Key használatáról átváltott a belső certificate.GetAnyPublicKey-re, amely a RSACertificateExtensions.GetRSAPublicKey-re továbbítja.
Javaslat
A .NET-keretrendszer 4.7.1-es verzióján futó alkalmazásoktól kezdve használhatja az alapértelmezés szerint használt CryptoServiceProvider-implementációt a .NET-keretrendszer 4.6.1-es és korábbi verzióiban, ha hozzáadja a következő konfigurációs kapcsolót az alkalmazás konfigurációs fájljának futtatókörnyezeti szakaszához:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
Érintett API-k
Windows Communication Foundation (WCF)
Holtpontot okozhat a Reentrant-szolgáltatások használata
Részletek
A holtpont reentrant szolgáltatást eredményezhet, amely a szolgáltatás példányait egyszerre egy végrehajtási szálra korlátozza. A problémára hajlamos szolgáltatások kódjában a következők ServiceBehaviorAttribute jelennek meg:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
Javaslat
A probléma megoldásához tegye a következőket:
- Állítsa a szolgáltatás egyidejűségi módját a következőre ConcurrencyMode.Single : vagy ConcurrencyMode.Multiple. Példa:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
- Telepítse a legújabb frissítést a .NET-keretrendszer 4.6.2-es verziójára, vagy frissítsen a .NET-keretrendszer egy későbbi verziójára. Ez letiltja a ExecutionContext folyamát OperationContext.Current-ban. Ez a viselkedés konfigurálható; ez egyenértékű azzal, hogy hozzáadja a következő alkalmazásbeállítást a konfigurációs fájlhoz:
<appSettings>
<add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="true" />
</appSettings>
Reentrant szolgáltatások esetében az Switch.System.ServiceModel.DisableOperationContextAsyncFlow értékét soha nem szabad false beállítani.
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
Érintett API-k
Az OperationContext.Current null értéket adhat vissza, ha egy használati záradékban meghívják
Részletek
OperationContext.Current visszatérhet null , és NullReferenceException is bekövetkezhet, ha az alábbi feltételek mindegyike teljesül:
- A OperationContext.Current tulajdonság értékét egy olyan metódusban kérdezed le, amely vagy egy Task-et vagy egy Task<TResult>-t ad vissza.
- Az objektumot
usingzáradékban példányosítja OperationContextScope. - Lekéri a OperationContext.Current tulajdonság értékét a
using statement-ben. Példa:
using (new OperationContextScope(OperationContext.Current))
{
// OperationContext.Current is null.
OperationContext context = OperationContext.Current;
// ...
}
Javaslat
A probléma megoldásához tegye a következőket:
Módosítsa a kódot az alábbiak szerint egy új
null-típusú objektum Current nélküli példányosításához:OperationContext ocx = OperationContext.Current; using (new OperationContextScope(OperationContext.Current)) { OperationContext.Current = new OperationContext(ocx.Channel); // ... }Telepítse a legújabb frissítést a .NET-keretrendszer 4.6.2-es verziójára, vagy frissítsen a .NET-keretrendszer egy későbbi verziójára. Ez letiltja a ExecutionContext adatfolyamát OperationContext.Current-ben, és visszaállítja a WCF-alkalmazások viselkedését a .NET 4.6.1-es verziójában és a korábbi verziókban. Ez a viselkedés konfigurálható; ez egyenértékű azzal, hogy hozzáadja a következő alkalmazásbeállítást a konfigurációs fájlhoz:
<appSettings> <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="true" /> </appSettings>Ha ez a módosítás nem kívánatos, és az alkalmazás a műveleti környezetek között folyó végrehajtási környezettől függ, az alábbiak szerint engedélyezheti a folyamatot:
<appSettings> <add key="Switch.System.ServiceModel.DisableOperationContextAsyncFlow" value="false" /> </appSettings>
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
Érintett API-k
A WCF átviteli biztonsága támogatja a CNG használatával tárolt tanúsítványokat
Részletek
A 4.6.2-.NET-keretrendszer megcélzott alkalmazásoktól kezdve a WCF átviteli biztonsága támogatja a Windows titkosítási könyvtár (CNG) használatával tárolt tanúsítványokat. Ez a támogatás olyan nyilvános kulccsal rendelkező tanúsítványokra korlátozódik, amelyek kitevője legfeljebb 32 bit hosszúságú. Ha egy alkalmazás a .NET-keretrendszer 4.6.2-t célozza, ez a funkció alapértelmezés szerint be van kapcsolva. A .NET-keretrendszer korábbi verzióiban az X509-tanúsítványok CSG-kulcstároló-szolgáltatóval való használatára tett kísérlet kivételt eredményez.
Javaslat
Azok az alkalmazások, amelyek a .NET-keretrendszer 4.6.1-es vagy korábbi verziót célják, de a .NET-keretrendszer 4.6.2-es verzióján futnak, engedélyezhetik a CNG-tanúsítványok támogatását az app.config vagy web.config fájl szakaszához a következő sor <runtime> hozzáadásával:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IdentityModel.DisableCngCertificates=false" />
</runtime>
Ez programozott módon is elvégezhető a következő kóddal:
private const string DisableCngCertificates = @"Switch.System.IdentityModel.DisableCngCertificate";
AppContext.SetSwitch(disableCngCertificates, false);
Const DisableCngCertificates As String = "Switch.System.IdentityModel.DisableCngCertificates"
AppContext.SetSwitch(disableCngCertificates, False)
Vegye figyelembe, hogy a módosítás miatt a CNG-tanúsítvánnyal való biztonságos kommunikáció sikertelenségére tett kísérlettől függő kivételkezelési kód a továbbiakban nem lesz végrehajtva.
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4.6.2 |
| Típus | Újracélzás |
Windows Forms
A MemberDescriptor.Equals helytelen implementálása
Részletek
A metódus eredeti implementációja MemberDescriptor.Equals két különböző karakterlánc-tulajdonságot hasonlít össze az összehasonlítandó objektumoktól: a kategória nevét és a leírási sztringet. A javítás célja, hogy összehasonlítsa az Category első objektumot a Category második objektummal, az Description elsőt pedig a Description másodikval.
Javaslat
Ha az alkalmazás attól függ, hogy MemberDescriptor.Equals esetenként false-t ad vissza, amikor a leírók egyenértékűek, és a .NET-keretrendszer 4.6.2-es vagy újabb verzióját célozza meg, több lehetősége is van:
- A MemberDescriptor.Equals metódus meghívása mellett módosítsa a kódot, hogy a Category és Description mezőket manuálisan is összehasonlítsa.
- A módosítás letiltásához adja hozzá a következő értéket az app.config fájlhoz:
<runtime>
<AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=true" />
</runtime>
Ha az alkalmazás a 4.6.1-.NET-keretrendszer vagy korábbi verziót célozza, és a .NET-keretrendszer 4.6.2 vagy újabb verzión fut, és engedélyezni szeretné ezt a módosítást, beállíthatja a kompatibilitási kapcsolót false úgy, hogy hozzáadja a következő értéket az app.config fájlhoz:
<runtime>
<AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=false" />
</runtime>
| Név | Érték |
|---|---|
| Hatókör | Edge |
| Verzió | 4.6.2 |
| Típus | Célzott újracélzás |
Érintett API-k
Windows Presentation Foundation (WPF)
A CurrentCulture nem marad meg a WPF-ütemező műveletek között
Részletek
A .NET-keretrendszer 4.6-os verziójától kezdve a System.Globalization.CultureInfo.CurrentCulture vagy a System.Globalization.CultureInfo.CurrentUICulture módosításai, amelyeket a System.Windows.Threading.Dispatcher belül hajtanak végre, elvesznek a diszpécser művelet végén. Hasonlóképpen előfordulhat, hogy a System.Globalization.CultureInfo.CurrentCulture diszpécserművelet vagy a System.Globalization.CultureInfo.CurrentUICulture kívül végzett módosítások nem jelennek meg a művelet végrehajtásakor. Gyakorlatilag ez azt jelenti, hogy a System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture közötti változások nem biztos, hogy áramlanak a WPF felhasználói felületi visszahívások és egyéb WPF-alkalmazási kódok között. Ennek oka, hogy a System.Threading.ExecutionContext-ben bekövetkezett változás miatt System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture a végrehajtási környezetben kerül tárolásra a .NET-keretrendszer 4.6-os verzióját célzó alkalmazásokban. A WPF-diszpécserműveletek a művelet megkezdéséhez használt végrehajtási környezetet tárolják, és a művelet befejezésekor visszaállítják az előző környezetet. System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture most már a környezet részét képezik, így a diszpécserműveleten belüli módosítások nem maradnak meg a műveleten kívül.
Javaslat
A változás által érintett alkalmazások megkerülhetik ezt azzal, hogy a kívánt System.Globalization.CultureInfo.CurrentCulture vagy System.Globalization.CultureInfo.CurrentUICulture egy mezőbe tárolják, és minden Dispatcher-műveleti törzsben (beleértve a felhasználói felület esemény-visszahívási kezelőit is) ellenőrzik, hogy a megfelelő System.Globalization.CultureInfo.CurrentCulture és System.Globalization.CultureInfo.CurrentUICulture be vannak állítva. Alternatív megoldásként, mivel a WPF-változás alapjául szolgáló ExecutionContext-módosítás csak a .NET-keretrendszer 4.6-os vagy újabb verziót célzó alkalmazásokat érinti, ez a törés elkerülhető a .NET-keretrendszer 4.5.2.-.NET-keretrendszer 4.6-os vagy újabb verziót célzó alkalmazások esetében is, ha a következő kompatibilitási kapcsolót állítja be:
AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true);
A problémát a .NET-keretrendszer 4.6.2 verziója a WPF segítségével javította. A javítást a 4.6-os és 4.6.1-es .NET-keretrendszer verziók esetében a KB 3139549 frissítéssel is végrehajtották. A 4.6-os vagy újabb .NET-keretrendszer megcélzott alkalmazások automatikusan a megfelelő viselkedést kapják a WPF-alkalmazásokban – System.Globalization.CultureInfo.CurrentCulture/System.Globalization.CultureInfo.CurrentUICulturea ) a Dispatcher-műveletek között megmaradnak.
| Név | Érték |
|---|---|
| Hatókör | Csekély |
| Verzió | 4,6 |
| Típus | Retargetálás |