Alapvető .NET-kódtárak – kompatibilitástörő változások a .NET Core 1.0-3.0-ban
Az alapvető .NET-kódtárak biztosítják a .NET Core által használt primitíveket és egyéb általános típusokat.
A következő kompatibilitástörő változások dokumentálva vannak ezen a lapon:
.NET Core 3.0
A GroupCollection továbbítása az IEnumerable<T> kiterjesztési metódusaihoz egyértelműsítést igényel
Ha olyan bővítménymetódust hív meg, amely egy adott bővítményt GroupCollectionhasználIEnumerable<T>
, a típust egy öntöttel kell egyértelműsítenie.
Módosítás leírása
A .NET Core 3.0-tól System.Text.RegularExpressions.GroupCollection kezdve az általa implementálható egyéb típusok mellett implementál IEnumerable<KeyValuePair<String,Group>>
is, beleértve a IEnumerable<Group>
. Ez kétértelműséget eredményez egy olyan bővítménymetódus meghívásakor, amely egy IEnumerable<T>. Ha például egy példányon GroupCollection meghív egy ilyen bővítménymetódust, Enumerable.Counta következő fordítóhiba jelenik meg:
CS1061: A "GroupCollection" nem tartalmaz definíciót a "Count" kifejezéshez, és nem található akadálymentes "Count" kiterjesztési módszer, amely elfogadja a "GroupCollection" típusú első argumentumot (hiányzik egy használt irányelv vagy egy szerelvényhivatkozás?)
A .NET korábbi verzióiban nem volt kétértelműség és fordítási hiba.
Bevezetett verzió
3,0
A változás oka
Ez nem szándékos törés volt. Mivel már egy ideje így van, nem tervezzük visszaállítani. Emellett egy ilyen változás maga is törés lenne.
Javasolt művelet
Például GroupCollection egyértelműsítse azokat a bővítménymeta-metódusokat, amelyek egy leadott elemet fogadnak IEnumerable<T>
el.
// Without a cast - causes CS1061.
match.Groups.Count(_ => true)
// With a disambiguating cast.
((IEnumerable<Group>)m.Groups).Count(_ => true);
Kategória
Alapvető .NET-kódtárak
Érintett API-k
Minden olyan bővítménymetódus, amely elfogad egy bővítményt IEnumerable<T> , hatással van rá. Példa:
- System.Collections.Immutable.ImmutableArray.ToImmutableArray<TSource>(IEnumerable<TSource>)
- System.Collections.Immutable.ImmutableDictionary.ToImmutableDictionary
- System.Collections.Immutable.ImmutableHashSet.ToImmutableHashSet
- System.Collections.Immutable.ImmutableList.ToImmutableList<TSource>(IEnumerable<TSource>)
- System.Collections.Immutable.ImmutableSortedDictionary.ToImmutableSortedDictionary
- System.Collections.Immutable.ImmutableSortedSet.ToImmutableSortedSet
- System.Data.DataTableExtensions.CopyToDataTable
System.Linq.Enumerable
A legtöbb módszer, például:System.Linq.Enumerable.Count- System.Linq.ParallelEnumerable.AsParallel
- System.Linq.Queryable.AsQueryable
Azok az API-k, amelyek a jelentésverziót jelentik, és nem a fájlverziót jelentik
A .NET Core-ban verziót vissza adó API-k közül sok most a termékverziót adja vissza a fájlverzió helyett.
Módosítás leírása
A .NET Core 2.2-es és korábbi verzióiban Environment.VersionRuntimeInformation.FrameworkDescriptiona .NET Core-szerelvények fájltulajdonságainak párbeszédpanelje a fájlverziót tükrözi. A .NET Core 3.0-tól kezdve a termékverziót tükrözik.
Az alábbi ábra a .NET Core 2.2 (bal oldalon) és a .NET Core 3.0 (jobb oldalon) System.Runtime.dll szerelvény verzióadatainak különbségét mutatja be a Windows Intéző fájltulajdonságok párbeszédpanelén látható módon.
Bevezetett verzió
3,0
Javasolt művelet
Nincs. Ennek a módosításnak intuitívabbá kell tennie a verzióészlelést, és nem kell eltűrnie.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
Az egyéni EncoderFallbackBuffer-példányok nem eshetnek vissza rekurzívan
Az egyéni EncoderFallbackBuffer példányok nem eshetnek vissza rekurzív módon. A megvalósításnak EncoderFallbackBuffer.GetNextChar() olyan karaktersorozatot kell eredményeznie, amely a célkódolásra konvertálható. Ellenkező esetben kivétel történik.
Módosítás leírása
A karakterről bájtra transzkódolási művelet során a futtatókörnyezet észleli a hibásan formázott vagy nem konvertálható UTF-16 sorozatokat, és megadja ezeket a karaktereket a EncoderFallbackBuffer.Fallback metódusnak. A Fallback
metódus meghatározza, hogy mely karaktereket kell helyettesíteni az eredeti nem konverbilis adatokkal, és ezeket a karaktereket egy ciklus meghívásával EncoderFallbackBuffer.GetNextChar üríti ki a rendszer.
A futtatókörnyezet ezután megpróbálja átkódolni ezeket a helyettesítő karaktereket a célkódolásra. Ha ez a művelet sikeres, a futtatókörnyezet továbbra is átkódolást hajt végre onnan, ahol az eredeti bemeneti sztringben abbahagyta.
Korábban az egyéni implementációk EncoderFallbackBuffer.GetNextChar() olyan karaktersorozatokat adhatnak vissza, amelyek nem konvertálhatók a célkódolásra. Ha a helyettesítő karakterek nem kódolhatók át a célkódolásra, a futtatókörnyezet ismét meghívja a EncoderFallbackBuffer.Fallback metódust a helyettesítő karakterekkel, és azt várja, hogy a EncoderFallbackBuffer.GetNextChar() metódus egy új helyettesítési sorozatot ad vissza. Ez a folyamat addig folytatódik, amíg a futtatókörnyezet végül egy jól formázott, átalakítható helyettesítést nem lát, vagy amíg el nem éri a maximális rekurziós számot.
A .NET Core 3.0-tól kezdve az egyéni implementációknak EncoderFallbackBuffer.GetNextChar() vissza kell adniuk a célkódolásra konvertálható karaktersorozatokat. Ha a helyettesítő karakterek nem kódolhatók át a célkódolásra, a rendszer egy ArgumentException karaktert ad vissza. A futtatókörnyezet többé nem indít rekurzív hívásokat a EncoderFallbackBuffer példányba.
Ez a viselkedés csak akkor érvényes, ha a következő három feltétel teljesül:
- A futtatókörnyezet egy rosszul formázott UTF-16 sorozatot vagy egy UTF-16 sorozatot észlel, amely nem konvertálható a célkódolásra.
- EncoderFallback Egyéni beállítás van megadva.
- Az egyéni EncoderFallback kísérletek egy új rosszul formázott vagy nem konvertálható UTF-16 sorozat helyettesítésére.
Bevezetett verzió
3,0
Javasolt művelet
A legtöbb fejlesztőnek nem kell semmilyen műveletet elvégeznie.
Ha egy alkalmazás egyéni EncoderFallback és EncoderFallbackBuffer osztályt használ, győződjön meg arról, hogy a tartalék puffert EncoderFallbackBuffer.Fallback jól formázott UTF-16-adatokkal tölti fel, amelyek közvetlenül konvertálhatók a célkódolásra, amikor a futtatókörnyezet először meghívja a Fallback metódust.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
Módosult a lebegőpontos formázás és elemzési viselkedés
A lebegőpontos elemzési és formázási viselkedés (a típusok és Single a Double típusok szerint) most már Enterprise kiadás E-kompatibilis. Ez biztosítja, hogy a lebegőpontos típusok viselkedése a .NET-ben megegyezik a többi I Enterprise kiadás E-kompatibilis nyelv viselkedésével. Például mindig meg kell egyeznie azzal, double.Parse("SomeLiteral")
amit a C# állít elő.double x = SomeLiteral
Módosítás leírása
A .NET Core 2.2-ben és a korábbi verziókban a formázás Double.ToString és Single.ToStringaz elemzés a következővelDouble.Parse: , Double.TryParse, Single.Parseés Single.TryParse nem I Enterprise kiadás E-kompatibilis. Ennek eredményeképpen lehetetlen garantálni, hogy egy érték lekerekítve legyen bármilyen támogatott szabványos vagy egyéni formátumsztringgel. Egyes bemenetek esetében a formázott érték elemzésének kísérlete sikertelen lehet, mások esetében pedig az elemzési érték nem egyenlő az eredeti értékkel.
A .NET Core 3.0-tól kezdve a lebegőpontos elemzési és formázási műveletek I Enterprise kiadás E 754-kompatibilisek.
Az alábbi táblázat két kódrészletet és a .NET Core 2.2 és a .NET Core 3.1 közötti kimenet változását mutatja be.
Kódrészletet | Kimenet a .NET Core 2.2-n | Kimenet a .NET Core 3.1-en |
---|---|---|
Console.WriteLine((-0.0).ToString()); |
0 | 0- |
var value = -3.123456789123456789; Console.WriteLine(value == double.Parse(value.ToString())); |
False |
True |
További információkért tekintse meg a lebegőpontos elemzési és formázási fejlesztéseket a .NET Core 3.0 blogbejegyzésében.
Bevezetett verzió
3,0
Javasolt művelet
A lebegőpontos elemzési és formázási fejlesztések meglévő kódszakaszára gyakorolt lehetséges hatás a .NET Core 3.0 blogbejegyzésben arra utal, hogy a kódon elvégezhet néhány módosítást, ha meg szeretné tartani az előző viselkedést.
- A formázás egyes eltérései esetén egy másik formátumsztring megadásával az előző viselkedésnek megfelelő viselkedést kaphat.
- Az elemzési különbségek esetén nincs olyan mechanizmus, amely visszaeshet az előző viselkedésre.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
A lebegőpontos elemzési műveletek már nem hiúsulnak meg, vagy túlcsordulást jeleznek
A lebegőpontos elemzési metódusok már nem adnak vissza vagy nem adnak OverflowException vissza false
értéket, ha olyan sztringet elemeznek, amelynek numerikus értéke kívül esik a lebegőpontos vagy Double a Single lebegőpontos típus tartományán.
Módosítás leírása
A .NET Core 2.2-es és korábbi verzióiban a Double.Parse metódusok olyan Single.Parse értékeket adnak OverflowException meg, amelyek nem tartoznak a megfelelő típus tartományába. A Double.TryParse tartományon kívüli numerikus értékek sztringreprezentációinak és Single.TryParse metódusainak visszaadása false
.
A .NET Core 3.0-tól kezdve a Double.Parse, Double.TryParse, Single.Parseés Single.TryParse metódusok már nem hiúsulnak meg a tartományon kívüli numerikus sztringek elemzésekor. Ehelyett az elemzési metódusok a Double túllépett Double.MaxValueértékeknél térnek visszaDouble.PositiveInfinity, és a kisebb Double.MinValueértékeknél térnek visszaDouble.NegativeInfinity. Hasonlóképpen, az elemzési metódusok a Single nagyobb Single.MaxValueértékeket is visszaadjákSingle.PositiveInfinity, és a kisebb Single.MinValueértékeket adnak visszaSingle.NegativeInfinity.
Ez a módosítás a jobb I Enterprise kiadás E 754:2008 megfelelőség érdekében történt.
Bevezetett verzió
3,0
Javasolt művelet
Ez a módosítás kétféleképpen befolyásolhatja a kódot:
A kód a túlcsorduláskor végrehajtandó kezelőtől OverflowException függ. Ebben az esetben távolítsa el az utasítást, és helyezze el a
catch
szükséges kódot egyIf
utasításban, amely ellenőrzi, hogy van-e Double.IsInfinitytrue
.Single.IsInfinityA kód feltételezi, hogy a lebegőpontos értékek nem
Infinity
. Ebben az esetben hozzá kell adnia a szükséges kódot a lebegőpontos értékekPositiveInfinity
ésNegativeInfinity
a .
Kategória
Alapvető .NET-kódtárak
Érintett API-k
InvalidAsynchronousStateException áthelyezve egy másik szerelvénybe
Az InvalidAsynchronousStateException osztály át lett helyezve.
Módosítás leírása
A .NET Core 2.2-es és korábbi verzióiban az InvalidAsynchronousStateException osztály a System.ComponentModel.TypeConverter szerelvényben található.
A .NET Core 3.0-tól kezdve a System.ComponentModel.Primitives szerelvényben található.
Bevezetett verzió
3,0
Javasolt művelet
Ez a változás csak azokat az alkalmazásokat érinti, amelyek tükrözést használnak a InvalidAsynchronousStateException terheléshez egy olyan metódus meghívásávalActivator.CreateInstance, mint például Assembly.GetType egy olyan túlterhelés, amely feltételezi, hogy a típus egy adott szerelvényben található. Ha ez a helyzet, frissítse a metódushívásban hivatkozott szerelvényt, hogy tükrözze a típus új szerelvényhelyét.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
Nincs.
A rosszul formázott UTF-8 bájtsorozatok cseréje Unicode-irányelveket követ
Ha az UTF8Encoding osztály hibás UTF-8 bájtsorozattal találkozik egy bájtról karakterre történő átkódolási művelet során, akkor ezt a sorozatot a kimeneti sztringben egy ' ' (U+FFFD REPLACE CHARACTER) karakterre cseréli. A .NET Core 3.0 eltér a .NET Core korábbi verzióitól és a .NET-keretrendszer a Unicode ajánlott eljárásának követésével, amely a helyettesítést a transzkódolási művelet során hajtja végre.
Ez egy nagyobb erőfeszítés része az UTF-8 kezelésének javítása a .NET-ben, beleértve az új System.Text.Unicode.Utf8 és System.Text.Rune a típusok által is. A UTF8Encoding típus továbbfejlesztett hibakezelési mechanikát kapott, hogy az az újonnan bevezetett típusokkal összhangban hozza létre a kimenetet.
Módosítás leírása
A .NET Core 3.0-tól kezdve a bájtok karakterekre való átkódolásakor az osztály a UTF8Encoding Unicode ajánlott eljárásai alapján végez karakterhelyettesítést. A használt helyettesítési mechanizmust a Unicode Standard 12.0-s, 3.9-es (PDF) verziója ismerteti a maximális alrészek U+FFFD helyettesítése című címsorban.
Ez a viselkedés csak akkor érvényes, ha a bemeneti bájtsor hibásan formázott UTF-8 adatokat tartalmaz. Továbbá, ha a UTF8Encoding példányt létrehozták throwOnInvalidBytes: true
, a UTF8Encoding
példány továbbra is érvénytelen bemenetet ad vissza ahelyett, hogy U+FFFD-cserét végez. A konstruktorról további információt a UTF8Encoding
UTF8Encoding(Boolean, Boolean).
Az alábbi táblázat egy érvénytelen 3 bájtos bemenettel szemlélteti a változás hatását:
Rosszul formázott 3 bájtos bemenet | Kimenet a .NET Core 3.0 előtt | Kimenet a .NET Core 3.0-val kezdődően |
---|---|---|
[ ED A0 90 ] |
[ FFFD FFFD ] (2 karakteres kimenet) |
[ FFFD FFFD FFFD ] (3 karakteres kimenet) |
A 3 karakteres kimenet az előnyben részesített kimenet a korábban csatolt Unicode Standard PDF 3–9. táblázata szerint.
Bevezetett verzió
3,0
Javasolt művelet
Nincs szükség műveletre a fejlesztő részéről.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
TypeDescriptionProviderAttribute áthelyezve egy másik szerelvénybe
Az TypeDescriptionProviderAttribute osztály át lett helyezve.
Módosítás leírása
A .NET Core 2.2-es és korábbi verzióiban az TypeDescriptionProviderAttribute osztály a System.ComponentModel.TypeConverter szerelvényben található.
A .NET Core 3.0-tól kezdve a System.ObjectModel szerelvényben található.
Bevezetett verzió
3,0
Javasolt művelet
Ez a változás csak azokat az alkalmazásokat érinti, amelyek tükröződéssel töltik be a TypeDescriptionProviderAttribute típust egy olyan metódus meghívásával, mint például Assembly.GetType egy olyan túlterhelés Activator.CreateInstance , amely feltételezi, hogy a típus egy adott szerelvényben található. Ebben az esetben a metódushívásban hivatkozott szerelvényt frissíteni kell, hogy tükrözze a típus új szerelvényhelyét.
Kategória
Windows Forms
Érintett API-k
Nincs.
A ZipArchiveEntry már nem kezeli az inkonzisztens bejegyzésméretű archívumokat
A zip-archívumok a tömörített és a tömörítetlen méretet is felsorolják a központi könyvtárban és a helyi fejlécben. Maga a belépési adatok is jelzik a méretét. A .NET Core 2.2-ben és a korábbi verziókban ezek az értékek soha nem lettek ellenőrizve a konzisztencia szempontjából. A .NET Core 3.0-tól kezdve ezek most már elérhetők.
Módosítás leírása
A .NET Core 2.2-ben és a korábbi verziókban akkor is sikeres, ZipArchiveEntry.Open() ha a helyi fejléc nem ért egyet a zip-fájl központi fejlécével. Az adatok a tömörített stream végéig lesznek tömörítve, még akkor is, ha a fájl hossza meghaladja a központi könyvtárban/helyi fejlécben felsorolt tömörítetlen fájlméretet.
A .NET Core 3.0-tól kezdve a metódus ellenőrzi, hogy a ZipArchiveEntry.Open() helyi fejléc és a központi fejléc megegyezik-e egy bejegyzés tömörített és tömörítetlen méretével. Ha nem, a metódus egy InvalidDataException olyan, ha az archívum helyi fejléc- és/vagy adatleíró listamérete nem egyezik meg a zip-fájl központi könyvtárával. Bejegyzés olvasásakor a rendszer csonkolja a tömörített adatokat a fejlécben felsorolt tömörítetlen fájlméretre.
Ez a módosítás annak biztosítása érdekében történt, hogy a ZipArchiveEntry rendszer helyesen adja meg az adatok méretét, és hogy csak az adatmennyiség legyen olvasható.
Bevezetett verzió
3,0
Javasolt művelet
Csomagolja újra a zip archívumot, amely ezeket a problémákat mutatja.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
- ZipArchiveEntry.Open()
- ZipFileExtensions.ExtractToDirectory
- ZipFileExtensions.ExtractToFile
- ZipFile.ExtractToDirectory
A FieldInfo.SetValue kivételt jelez a statikus, csak init-only mezők esetében
A .NET Core 3.0-tól kezdve kivétel történik, ha egy statikus mező InitOnly értékét hívással System.Reflection.FieldInfo.SetValuepróbálja beállítani.
Módosítás leírása
A .NET Core 3.0 előtti .NET-keretrendszer és verzióiban beállíthatja egy állandó statikus mező értékét az inicializálás után (olvashatóan C#-ban) hívássalSystem.Reflection.FieldInfo.SetValue. Az ilyen mezők ilyen módon történő beállítása azonban kiszámíthatatlan viselkedést eredményezett a cél-keretrendszer és az optimalizálási beállítások alapján.
A .NET Core 3.0-s és újabb verzióiban, amikor statikus mezőre InitOnly hív felSetValue, a rendszer kivételt System.FieldAccessException jelez.
Tipp.
A InitOnly mező olyan mező, amelyet csak a deklaráláskor vagy az azt tartalmazó osztály konstruktorában lehet beállítani. Más szóval az inicializálás után állandó.
Bevezetett verzió
3,0
Javasolt művelet
Statikus inicializálás, InitOnly statikus konstruktor mezői. Ez a dinamikus és a nem dinamikus típusokra is vonatkozik.
Másik lehetőségként eltávolíthatja az attribútumot a FieldAttributes.InitOnly mezőből, majd meghívhatja FieldInfo.SetValue.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
- FieldInfo.SetValue(Object, Object)
- FieldInfo.SetValue(Object, Object, BindingFlags, Binder, CultureInfo)
.NET Core 2.1
Az elérési út API-k nem adnak kivételt érvénytelen karakterek esetén
A fájlelérési utakat tartalmazó API-k már nem ellenőrzik az elérési út karaktereit, vagy ArgumentException érvénytelen karaktert eredményeznek.
Módosítás leírása
A .NET-keretrendszer és a .NET Core 1.0 – 2.0 rendszerben az Érintett API-k szakaszban felsorolt metódusok érvénytelen ArgumentException elérési utat tartalmaznak. A .NET Core 2.1-től kezdődően ezek a metódusok már nem ellenőrzik az érvénytelen elérésiút-karaktereket , és nem jeleznek kivételt, ha érvénytelen karaktert talál.
A változás oka
Az elérésiút-karakterek agresszív érvényesítése blokkol néhány platformfüggetlen forgatókönyvet. Ez a módosítás azért lett bevezetve, hogy a .NET ne próbálja meg replikálni vagy megjósolni az operációs rendszer API-hívásainak eredményét. További információ: a .NET Core 2.1 betekintő blogbejegyzésének System.IO.
Bevezetett verzió
.NET Core 2.1
Javasolt művelet
Ha a kód ezekre az API-kra támaszkodott, hogy ellenőrizze az érvénytelen karaktereket, felvehet egy hívást a következőbe Path.GetInvalidPathChars: .
Érintett API-k
- System.IO.Directory.CreateDirectory
- System.IO.Directory.Delete
- System.IO.Directory.EnumerateDirectories
- System.IO.Directory.EnumerateFiles
- System.IO.Directory.EnumerateFileSystemEntries
- System.IO.Directory.GetCreationTime(String)
- System.IO.Directory.GetCreationTimeUtc(String)
- System.IO.Directory.GetDirectories
- System.IO.Directory.GetDirectoryRoot(String)
- System.IO.Directory.GetFiles
- System.IO.Directory.GetFileSystemEntries
- System.IO.Directory.GetLastAccessTime(String)
- System.IO.Directory.GetLastAccessTimeUtc(String)
- System.IO.Directory.GetLastWriteTime(String)
- System.IO.Directory.GetLastWriteTimeUtc(String)
- System.IO.Directory.GetParent(String)
- System.IO.Directory.Move(String, String)
- System.IO.Directory.SetCreationTime(String, DateTime)
- System.IO.Directory.SetCreationTimeUtc(String, DateTime)
- System.IO.Directory.SetCurrentDirectory(String)
- System.IO.Directory.SetLastAccessTime(String, DateTime)
- System.IO.Directory.SetLastAccessTimeUtc(String, DateTime)
- System.IO.Directory.SetLastWriteTime(String, DateTime)
- System.IO.Directory.SetLastWriteTimeUtc(String, DateTime)
- System.IO.DirectoryInfo ctor
- System.IO.Directory.GetDirectories
- System.IO.Directory.GetFiles
- System.IO.DirectoryInfo.GetFileSystemInfos
- System.IO.File.AppendAllText
- System.IO.File.AppendAllTextAsync
- System.IO.File.Copy
- System.IO.File.Create
- System.IO.File.CreateText
- System.IO.File.Decrypt
- System.IO.File.Delete
- System.IO.File.Encrypt
- System.IO.File.GetAttributes(String)
- System.IO.File.GetCreationTime(String)
- System.IO.File.GetCreationTimeUtc(String)
- System.IO.File.GetLastAccessTime(String)
- System.IO.File.GetLastAccessTimeUtc(String)
- System.IO.File.GetLastWriteTime(String)
- System.IO.File.GetLastWriteTimeUtc(String)
- System.IO.File.Move
- System.IO.File.Open
- System.IO.File.OpenRead(String)
- System.IO.File.OpenText(String)
- System.IO.File.OpenWrite(String)
- System.IO.File.ReadAllBytes(String)
- System.IO.File.ReadAllBytesAsync(String, CancellationToken)
- System.IO.File.ReadAllLines(String)
- System.IO.File.ReadAllLinesAsync(String, CancellationToken)
- System.IO.File.ReadAllText(String)
- System.IO.File.ReadAllTextAsync(String, CancellationToken)
- System.IO.File.SetAttributes(String, FileAttributes)
- System.IO.File.SetCreationTime(String, DateTime)
- System.IO.File.SetCreationTimeUtc(String, DateTime)
- System.IO.File.SetLastAccessTime(String, DateTime)
- System.IO.File.SetLastAccessTimeUtc(String, DateTime)
- System.IO.File.SetLastWriteTime(String, DateTime)
- System.IO.File.SetLastWriteTimeUtc(String, DateTime)
- System.IO.File.WriteAllBytes(String, Byte[])
- System.IO.File.WriteAllBytesAsync(String, Byte[], CancellationToken)
- System.IO.File.WriteAllLines
- System.IO.File.WriteAllLinesAsync
- System.IO.File.WriteAllText
- System.IO.FileInfo ctor
- System.IO.FileInfo.CopyTo
- System.IO.FileInfo.MoveTo
- System.IO.FileStream ctor
- System.IO.Path.GetFullPath(String)
- System.IO.Path.IsPathRooted(String)
- System.IO.Path.GetPathRoot(String)
- System.IO.Path.ChangeExtension(String, String)
- System.IO.Path.GetDirectoryName(String)
- System.IO.Path.GetExtension(String)
- System.IO.Path.HasExtension(String)
- System.IO.Path.Combine
Lásd még
Beépített strukturált típusokhoz hozzáadott privát mezők
A referenciaszerelvények egyes struktúratípusaihoz magánmezők lettek hozzáadva. Ennek eredményeképpen a C#-ban ezeket a szerkezettípusokat mindig az új operátor vagy az alapértelmezett literál használatával kell példányosíteni.
Módosítás leírása
A .NET Core 2.0-s és korábbi verzióiban néhány megadott struktúratípus, például ConsoleKeyInfoaz operátor vagy az new
alapértelmezett literál C# használata nélkül is példányosítható. Ennek az az oka, hogy a C#-fordító által használt referenciaszerelvények nem tartalmazzák a szerkezetek privát mezőit. A .NET-struktúratípusok összes magánmezője hozzá lesz adva a .NET Core 2.1-től kezdődő referenciaszerelvényekhez.
A következő C#-kód például a .NET Core 2.0-ban áll össze, a .NET Core 2.1-ben azonban nem:
ConsoleKeyInfo key; // Struct type
if (key.ToString() == "y")
{
Console.WriteLine("Yes!");
}
A .NET Core 2.1-ben az előző kód a következő fordítóhibát eredményezi: CS0165 – Nem hozzárendelt helyi változó (kulcs) használata
Bevezetett verzió
2.1
Javasolt művelet
A szerkezettípusok példányosítása az operátor vagy az new
alapértelmezett literál használatával.
Példa:
ConsoleKeyInfo key = new ConsoleKeyInfo(); // Struct type.
if (key.ToString() == "y")
Console.WriteLine("Yes!");
ConsoleKeyInfo key = default; // Struct type.
if (key.ToString() == "y")
Console.WriteLine("Yes!");
Kategória
Alapvető .NET-kódtárak
Érintett API-k
- System.ArraySegment<T>.Enumerator
- System.ArraySegment<T>
- System.Boolean
- System.Buffers.MemoryHandle
- System.Buffers.StandardFormat
- System.Byte
- System.Char
- System.Collections.DictionaryEntry
- System.Collections.Generic.Dictionary<TKey,TValue>.Enumerator
- System.Collections.Generic.Dictionary<TKey,TValue>.KeyCollection.Enumerator
- System.Collections.Generic.Dictionary<TKey,TValue>.ValueCollection.Enumerator
- System.Collections.Generic.HashSet<T>.Enumerator
- System.Collections.Generic.KeyValuePair<TKey,TValue>
- System.Collections.Generic.LinkedList<T>.Enumerator
- System.Collections.Generic.List<T>.Enumerator
- System.Collections.Generic.Queue<T>.Enumerator
- System.Collections.Generic.SortedDictionary<TKey,TValue>.Enumerator
- System.Collections.Generic.SortedDictionary<TKey,TValue>.KeyCollection.Enumerator
- System.Collections.Generic.SortedDictionary<TKey,TValue>.ValueCollection.Enumerator
- System.Collections.Generic.SortedSet<T>.Enumerator
- System.Collections.Generic.Stack<T>.Enumerator
- System.Collections.Immutable.ImmutableArray<T>.Enumerator
- System.Collections.Immutable.ImmutableArray<T>
- System.Collections.Immutable.ImmutableDictionary<TKey,TValue>.Enumerator
- System.Collections.Immutable.ImmutableHashSet<T>.Enumerator
- System.Collections.Immutable.ImmutableList<T>.Enumerator
- System.Collections.Immutable.ImmutableQueue<T>.Enumerator
- System.Collections.Immutable.ImmutableSortedDictionary<TKey,TValue>.Enumerator
- System.Collections.Immutable.ImmutableSortedSet<T>.Enumerator
- System.Collections.Immutable.ImmutableStack<T>.Enumerator
- System.Collections.Specialized.BitVector32.Section
- System.Collections.Specialized.BitVector32
- LazyMemberInfo
- System.ComponentModel.Design.Serialization.MemberRelationship
- System.ConsoleKeyInfo
- System.Data.SqlTypes.SqlBinary
- System.Data.SqlTypes.SqlBoolean
- System.Data.SqlTypes.SqlByte
- System.Data.SqlTypes.SqlDateTime
- System.Data.SqlTypes.SqlDecimal
- System.Data.SqlTypes.SqlDouble
- System.Data.SqlTypes.SqlGuid
- System.Data.SqlTypes.SqlInt16
- System.Data.SqlTypes.SqlInt32
- System.Data.SqlTypes.SqlInt64
- System.Data.SqlTypes.SqlMoney
- System.Data.SqlTypes.SqlSingle
- System.Data.SqlTypes.SqlString
- System.DateTime
- System.DateTimeOffset
- System.Decimal
- System.Diagnostics.CounterSample
- System.Diagnostics.SymbolStore.SymbolToken
- System.Diagnostics.Tracing.EventSource.EventData
- System.Diagnostics.Tracing.EventSourceOptions
- System.Double
- System.Drawing.CharacterRange
- System.Drawing.Point
- System.Drawing.PointF
- System.Drawing.Rectangle
- System.Drawing.RectangleF
- System.Drawing.Size
- System.Drawing.SizeF
- System.Guid
- System.HashCode
- System.Int16
- System.Int32
- System.Int64
- System.IntPtr
- System.IO.Pipelines.FlushResult
- System.IO.Pipelines.ReadResult
- System.IO.WaitForChangedResult
- System.Memory<T>
- System.ModuleHandle
- System.Net.Security.SslApplicationProtocol
- System.Net.Sockets.IPPacketInformation
- System.Net.Sockets.SocketInformation
- System.Net.Sockets.UdpReceiveResult
- System.Net.WebSockets.ValueWebSocketReceiveResult
- System.Nullable<T>
- System.Numerics.BigInteger
- System.Numerics.Complex
- System.Numerics.Vector<T>
- System.ReadOnlyMemory<T>
- System.ReadOnlySpan<T>.Enumerator
- System.ReadOnlySpan<T>
- System.Reflection.CustomAttributeNamedArgument
- System.Reflection.CustomAttributeTypedArgument
- System.Reflection.Emit.Label
- System.Reflection.Emit.OpCode
- System.Reflection.Metadata.ArrayShape
- System.Reflection.Metadata.AssemblyDefinition
- System.Reflection.Metadata.AssemblyDefinitionHandle
- System.Reflection.Metadata.AssemblyFile
- System.Reflection.Metadata.AssemblyFileHandle
- System.Reflection.Metadata.AssemblyFileHandleCollection.Enumerator
- System.Reflection.Metadata.AssemblyFileHandleCollection
- System.Reflection.Metadata.AssemblyReference
- System.Reflection.Metadata.AssemblyReferenceHandle
- System.Reflection.Metadata.AssemblyReferenceHandleCollection.Enumerator
- System.Reflection.Metadata.AssemblyReferenceHandleCollection
- System.Reflection.Metadata.Blob
- System.Reflection.Metadata.BlobBuilder.Blobs
- System.Reflection.Metadata.BlobContentId
- System.Reflection.Metadata.BlobHandle
- System.Reflection.Metadata.BlobReader
- System.Reflection.Metadata.BlobWriter
- System.Reflection.Metadata.Constant
- System.Reflection.Metadata.ConstantHandle
- System.Reflection.Metadata.CustomAttribute
- System.Reflection.Metadata.CustomAttributeHandle
- System.Reflection.Metadata.CustomAttributeHandleCollection.Enumerator
- System.Reflection.Metadata.CustomAttributeHandleCollection
- System.Reflection.Metadata.CustomAttributeNamedArgument<TType>
- System.Reflection.Metadata.CustomAttributeTypedArgument<TType>
- System.Reflection.Metadata.CustomAttributeValue<TType>
- System.Reflection.Metadata.CustomDebugInformation
- System.Reflection.Metadata.CustomDebugInformationHandle
- System.Reflection.Metadata.CustomDebugInformationHandleCollection.Enumerator
- System.Reflection.Metadata.CustomDebugInformationHandleCollection
- System.Reflection.Metadata.DeclarativeSecurityAttribute
- System.Reflection.Metadata.DeclarativeSecurityAttributeHandle
- System.Reflection.Metadata.DeclarativeSecurityAttributeHandleCollection.Enumerator
- System.Reflection.Metadata.DeclarativeSecurityAttributeHandleCollection
- System.Reflection.Metadata.Document
- System.Reflection.Metadata.DocumentHandle
- System.Reflection.Metadata.DocumentHandleCollection.Enumerator
- System.Reflection.Metadata.DocumentHandleCollection
- System.Reflection.Metadata.DocumentNameBlobHandle
- System.Reflection.Metadata.Ecma335.ArrayShapeEncoder
- System.Reflection.Metadata.Ecma335.BlobEncoder
- System.Reflection.Metadata.Ecma335.CustomAttributeArrayTypeEncoder
- System.Reflection.Metadata.Ecma335.CustomAttributeElementTypeEncoder
- System.Reflection.Metadata.Ecma335.CustomAttributeNamedArgumentsEncoder
- System.Reflection.Metadata.Ecma335.CustomModifiersEncoder
- System.Reflection.Metadata.Ecma335.EditAndContinueLogEntry
- System.Reflection.Metadata.Ecma335.ExceptionRegionEncoder
- System.Reflection.Metadata.Ecma335.FixedArgumentsEncoder
- System.Reflection.Metadata.Ecma335.GenericTypeArgumentsEncoder
- System.Reflection.Metadata.Ecma335.InstructionEncoder
- System.Reflection.Metadata.Ecma335.LabelHandle
- System.Reflection.Metadata.Ecma335.LiteralEncoder
- System.Reflection.Metadata.Ecma335.LiteralsEncoder
- System.Reflection.Metadata.Ecma335.LocalVariablesEncoder
- System.Reflection.Metadata.Ecma335.LocalVariableTypeEncoder
- System.Reflection.Metadata.Ecma335.MethodBodyStreamEncoder.MethodBody
- System.Reflection.Metadata.Ecma335.MethodBodyStreamEncoder
- System.Reflection.Metadata.Ecma335.MethodSignatureEncoder
- System.Reflection.Metadata.Ecma335.NamedArgumentsEncoder
- System.Reflection.Metadata.Ecma335.NamedArgumentTypeEncoder
- System.Reflection.Metadata.Ecma335.NameEncoder
- System.Reflection.Metadata.Ecma335.ParametersEncoder
- System.Reflection.Metadata.Ecma335.ParameterTypeEncoder
- System.Reflection.Metadata.Ecma335.PermissionSetEncoder
- System.Reflection.Metadata.Ecma335.ReturnTypeEncoder
- System.Reflection.Metadata.Ecma335.ScalarEncoder
- System.Reflection.Metadata.Ecma335.SignatureDecoder<TType,TGenericContext>
- System.Reflection.Metadata.Ecma335.SignatureTypeEncoder
- System.Reflection.Metadata.Ecma335.VectorEncoder
- System.Reflection.Metadata.EntityHandle
- System.Reflection.Metadata.EventAccessors
- System.Reflection.Metadata.EventDefinition
- System.Reflection.Metadata.EventDefinitionHandle
- System.Reflection.Metadata.EventDefinitionHandleCollection.Enumerator
- System.Reflection.Metadata.EventDefinitionHandleCollection
- System.Reflection.Metadata.ExceptionRegion
- System.Reflection.Metadata.ExportedType
- System.Reflection.Metadata.ExportedTypeHandle
- System.Reflection.Metadata.ExportedTypeHandleCollection.Enumerator
- System.Reflection.Metadata.ExportedTypeHandleCollection
- System.Reflection.Metadata.FieldDefinition
- System.Reflection.Metadata.FieldDefinitionHandle
- System.Reflection.Metadata.FieldDefinitionHandleCollection.Enumerator
- System.Reflection.Metadata.FieldDefinitionHandleCollection
- System.Reflection.Metadata.GenericParameter
- System.Reflection.Metadata.GenericParameterConstraint
- System.Reflection.Metadata.GenericParameterConstraintHandle
- System.Reflection.Metadata.GenericParameterConstraintHandleCollection.Enumerator
- System.Reflection.Metadata.GenericParameterConstraintHandleCollection
- System.Reflection.Metadata.GenericParameterHandle
- System.Reflection.Metadata.GenericParameterHandleCollection.Enumerator
- System.Reflection.Metadata.GenericParameterHandleCollection
- System.Reflection.Metadata.GuidHandle
- System.Reflection.Metadata.Handle
- System.Reflection.Metadata.ImportDefinition
- System.Reflection.Metadata.ImportDefinitionCollection.Enumerator
- System.Reflection.Metadata.ImportDefinitionCollection
- System.Reflection.Metadata.ImportScope
- System.Reflection.Metadata.ImportScopeCollection.Enumerator
- System.Reflection.Metadata.ImportScopeCollection
- System.Reflection.Metadata.ImportScopeHandle
- System.Reflection.Metadata.InterfaceImplementation
- System.Reflection.Metadata.InterfaceImplementationHandle
- System.Reflection.Metadata.InterfaceImplementationHandleCollection.Enumerator
- System.Reflection.Metadata.InterfaceImplementationHandleCollection
- System.Reflection.Metadata.LocalConstant
- System.Reflection.Metadata.LocalConstantHandle
- System.Reflection.Metadata.LocalConstantHandleCollection.Enumerator
- System.Reflection.Metadata.LocalConstantHandleCollection
- System.Reflection.Metadata.LocalScope
- System.Reflection.Metadata.LocalScopeHandle
- System.Reflection.Metadata.LocalScopeHandleCollection.ChildrenEnumerator
- System.Reflection.Metadata.LocalScopeHandleCollection.Enumerator
- System.Reflection.Metadata.LocalScopeHandleCollection
- System.Reflection.Metadata.LocalVariable
- System.Reflection.Metadata.LocalVariableHandle
- System.Reflection.Metadata.LocalVariableHandleCollection.Enumerator
- System.Reflection.Metadata.LocalVariableHandleCollection
- System.Reflection.Metadata.ManifestResource
- System.Reflection.Metadata.ManifestResourceHandle
- System.Reflection.Metadata.ManifestResourceHandleCollection.Enumerator
- System.Reflection.Metadata.ManifestResourceHandleCollection
- System.Reflection.Metadata.MemberReference
- System.Reflection.Metadata.MemberReferenceHandle
- System.Reflection.Metadata.MemberReferenceHandleCollection.Enumerator
- System.Reflection.Metadata.MemberReferenceHandleCollection
- System.Reflection.Metadata.MetadataStringComparer
- System.Reflection.Metadata.MethodDebugInformation
- System.Reflection.Metadata.MethodDebugInformationHandle
- System.Reflection.Metadata.MethodDebugInformationHandleCollection.Enumerator
- System.Reflection.Metadata.MethodDebugInformationHandleCollection
- System.Reflection.Metadata.MethodDefinition
- System.Reflection.Metadata.MethodDefinitionHandle
- System.Reflection.Metadata.MethodDefinitionHandleCollection.Enumerator
- System.Reflection.Metadata.MethodDefinitionHandleCollection
- System.Reflection.Metadata.MethodImplementation
- System.Reflection.Metadata.MethodImplementationHandle
- System.Reflection.Metadata.MethodImplementationHandleCollection.Enumerator
- System.Reflection.Metadata.MethodImplementationHandleCollection
- System.Reflection.Metadata.MethodImport
- System.Reflection.Metadata.MethodSignature<TType>
- System.Reflection.Metadata.MethodSpecification
- System.Reflection.Metadata.MethodSpecificationHandle
- System.Reflection.Metadata.ModuleDefinition
- System.Reflection.Metadata.ModuleDefinitionHandle
- System.Reflection.Metadata.ModuleReference
- System.Reflection.Metadata.ModuleReferenceHandle
- System.Reflection.Metadata.NamespaceDefinition
- System.Reflection.Metadata.NamespaceDefinitionHandle
- System.Reflection.Metadata.Parameter
- System.Reflection.Metadata.ParameterHandle
- System.Reflection.Metadata.ParameterHandleCollection.Enumerator
- System.Reflection.Metadata.ParameterHandleCollection
- System.Reflection.Metadata.PropertyAccessors
- System.Reflection.Metadata.PropertyDefinition
- System.Reflection.Metadata.PropertyDefinitionHandle
- System.Reflection.Metadata.PropertyDefinitionHandleCollection.Enumerator
- System.Reflection.Metadata.PropertyDefinitionHandleCollection
- System.Reflection.Metadata.ReservedBlob<THandle>
- System.Reflection.Metadata.SequencePoint
- System.Reflection.Metadata.SequencePointCollection.Enumerator
- System.Reflection.Metadata.SequencePointCollection
- System.Reflection.Metadata.SignatureHeader
- System.Reflection.Metadata.StandaloneSignature
- System.Reflection.Metadata.StandaloneSignatureHandle
- System.Reflection.Metadata.StringHandle
- System.Reflection.Metadata.TypeDefinition
- System.Reflection.Metadata.TypeDefinitionHandle
- System.Reflection.Metadata.TypeDefinitionHandleCollection.Enumerator
- System.Reflection.Metadata.TypeDefinitionHandleCollection
- System.Reflection.Metadata.TypeLayout
- System.Reflection.Metadata.TypeReference
- System.Reflection.Metadata.TypeReferenceHandle
- System.Reflection.Metadata.TypeReferenceHandleCollection.Enumerator
- System.Reflection.Metadata.TypeReferenceHandleCollection
- System.Reflection.Metadata.TypeSpecification
- System.Reflection.Metadata.TypeSpecificationHandle
- System.Reflection.Metadata.UserStringHandle
- System.Reflection.ParameterModifier
- System.Reflection.PortableExecutable.CodeViewDebugDirectoryData
- System.Reflection.PortableExecutable.DebugDirectoryEntry
- System.Reflection.PortableExecutable.PEMemoryBlock
- System.Reflection.PortableExecutable.SectionHeader
- System.Runtime.CompilerServices.AsyncTaskMethodBuilder<TResult>
- System.Runtime.CompilerServices.AsyncTaskMethodBuilder
- System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder<TResult>
- System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder
- System.Runtime.CompilerServices.AsyncVoidMethodBuilder
- System.Runtime.CompilerServices.ConfiguredTaskAwaitable<TResult>.ConfiguredTaskAwaiter
- System.Runtime.CompilerServices.ConfiguredTaskAwaitable<TResult>
- System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter
- System.Runtime.CompilerServices.ConfiguredTaskAwaitable
- System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<TResult>
- System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<TResult>.ConfiguredValueTaskAwaiter
- System.Runtime.CompilerServices.TaskAwaiter<TResult>
- System.Runtime.CompilerServices.TaskAwaiter
- System.Runtime.CompilerServices.ValueTaskAwaiter<TResult>
- System.Runtime.CompilerServices.ValueTaskAwaiter<TResult>
- System.Runtime.InteropServices.ArrayWithOffset
- System.Runtime.InteropServices.GCHandle
- System.Runtime.InteropServices.HandleRef
- System.Runtime.InteropServices.OSPlatform
- System.Runtime.InteropServices.WindowsRuntime.EventRegistrationToken
- System.Runtime.Serialization.SerializationEntry
- System.Runtime.Serialization.StreamingContext
- System.RuntimeArgumentHandle
- System.RuntimeFieldHandle
- System.RuntimeMethodHandle
- System.RuntimeTypeHandle
- System.SByte
- System.Security.Cryptography.CngProperty
- System.Security.Cryptography.ECCurve
- System.Security.Cryptography.HashAlgorithmName
- System.Security.Cryptography.X509Certificates.X509ChainStatus
- System.Security.Cryptography.Xml.X509IssuerSerial
- System.ServiceProcess.SessionChangeDescription
- System.Single
- System.Span<T>.Enumerator
- System.Span<T>
- System.Threading.AsyncFlowControl
- System.Threading.AsyncLocalValueChangedArgs<T>
- System.Threading.CancellationToken
- System.Threading.CancellationTokenRegistration
- System.Threading.LockCookie
- System.Threading.SpinLock
- System.Threading.SpinWait
- System.Threading.Tasks.Dataflow.DataflowMessageHeader
- System.Threading.Tasks.ParallelLoopResult
- System.Threading.Tasks.ValueTask<TResult>
- System.TimeSpan
- System.TimeZoneInfo.TransitionTime
- System.Transactions.TransactionOptions
- System.TypedReference
- System.TypedReference
- System.UInt16
- System.UInt32
- System.UInt64
- System.UIntPtr
- System.Windows.Forms.ColorDialog.Color
- System.Windows.Media.Animation.KeyTime
- System.Windows.Media.Animation.RepeatBehavior
- System.Xml.Serialization.XmlDeserializationEvents
- Windows.Foundation.Point
- Windows.Foundation.Rect
- Windows.Foundation.Size
- Windows.UI.Color
- Windows.UI.Xaml.Controls.Primitives.GeneratorPosition
- Windows.UI.Xaml.CornerRadius
- Windows.UI.Xaml.Duration
- Windows.UI.Xaml.GridLength
- Windows.UI.Xaml.Media.Matrix
- Windows.UI.Xaml.Media.Media3D.Matrix3D
- Windows.UI.Xaml.Thickness
A UseShellExecute alapértelmezett értékének módosítása
ProcessStartInfo.UseShellExecute alapértelmezett értéke false
a .NET Core. A .NET-keretrendszer alapértelmezett értéke .true
Módosítás leírása
Process.Start lehetővé teszi egy alkalmazás közvetlen elindítását, például olyan kóddal, amely Process.Start("mspaint.exe")
elindítja a Paintet. Azt is lehetővé teszi, hogy közvetetten elindítson egy társított alkalmazást, ha ProcessStartInfo.UseShellExecute be van állítva true
. A .NET-keretrendszer alapértelmezett értéke ProcessStartInfo.UseShellExecute true
a következő, ami azt jelenti, hogy a kód, például Process.Start("mytextfile.txt")
Jegyzettömb indulna el, ha .txt fájlokat társított a szerkesztőhöz. Ha meg szeretné akadályozni, hogy az alkalmazás indirekt módon elinduljon .NET-keretrendszer, explicit módon be kell állítania ProcessStartInfo.UseShellExecute a következőtfalse
: . A .NET Core-on az alapértelmezett érték ProcessStartInfo.UseShellExecute a következő false
: . Ez azt jelenti, hogy a társított alkalmazások alapértelmezés szerint nem indulnak el híváskor Process.Start
.
A következő tulajdonságok System.Diagnostics.ProcessStartInfo csak akkor működnek, haProcessStartInfo.UseShellExecute:true
- ProcessStartInfo.CreateNoWindow
- ProcessStartInfo.ErrorDialog
- ProcessStartInfo.Verb
- ProcessStartInfo.WindowStyle.
Ezt a módosítást teljesítménybeli okokból vezettük be a .NET Core-ban. Process.Start Általában egy alkalmazás közvetlen indítására szolgál. Az alkalmazások közvetlen indításának nem kell bevonnia a Windows rendszerhéjat, és a kapcsolódó teljesítményköltségeket kell magában foglalnia. Az alapértelmezett eset gyorsabbá tétele érdekében a .NET Core az alapértelmezett értéket a következőre false
módosítjaProcessStartInfo.UseShellExecute: . Ha szüksége van rá, a lassabb útvonalat is választhatja.
Bevezetett verzió
2.1
Feljegyzés
A .NET Core UseShellExecute
korábbi verzióiban nem lett implementálva a Windows.
Javasolt művelet
Ha az alkalmazás a régi viselkedésre támaszkodik, hívja Process.Start(ProcessStartInfo) UseShellExecute meg az ProcessStartInfo objektumottrue
.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
OpenSSL-verziók macOS rendszeren
A macOS .NET Core 3.0-s és újabb futtatókörnyezetei mostantól az OpenSSL 1.1.x verziót részesítik előnyben az AesCcmOpenSSL 1.0.x verziókhoz a , AesGcm, DSAOpenSsl, ECDiffieHellmanOpenSsl, ECDsaOpenSsl, RSAOpenSslés SafeEvpPKeyHandle típusok esetében.
A .NET Core 2.1 futtatókörnyezet mostantól támogatja az OpenSSL 1.1.x verziókat, de továbbra is az OpenSSL 1.0.x verziót részesíti előnyben.
Módosítás leírása
A .NET Core-futtatókörnyezet korábban openSSL 1.0.x verziót használt macOS rendszeren az OpenSSL-t használó típusokhoz. Az OpenSSL 1.0.x legújabb verziója, az OpenSSL 1.0.2 már nem támogatott. Az OpenSSL-t az OpenSSL támogatott verzióiban használó típusok megtartása érdekében a .NET Core 3.0-s és újabb futtatókörnyezetei mostantól az OpenSSL újabb verzióit használják macOS rendszeren.
Ezzel a módosítással a .NET Core-futtatókörnyezetek viselkedése macOS rendszeren a következő:
A .NET Core 3.0-s és újabb verziói az OpenSSL 1.1.x verziót használják, ha elérhetőek, és csak akkor térjenek vissza az OpenSSL 1.0.x verzióra, ha nem érhető el 1.1.x verzió.
Az OpenSSL interoptípusokat egyéni P/Invokes használatával használó hívók esetében kövesse a SafeEvpPKeyHandle.OpenSslVersion megjegyzésekben található útmutatást. Az alkalmazás összeomlhat, ha nem ellenőrzi az OpenSslVersion értéket.
A .NET Core 2.1 futtatókörnyezet az OpenSSL 1.0.x verziót használja, ha elérhető, és az OpenSSL 1.1.x verzióra esik vissza, ha nem érhető el 1.0.x verzió.
A 2.1-es futtatókörnyezet az OpenSSL korábbi verzióját részesíti előnyben, mivel a SafeEvpPKeyHandle.OpenSslVersion tulajdonság nem létezik a .NET Core 2.1-ben, ezért az OpenSSL-verzió futásidőben nem határozható meg megbízhatóan.
Bevezetett verzió
- .NET Core 2.1.16
- .NET Core 3.0.3
- .NET Core 3.1.2
Javasolt művelet
Távolítsa el az OpenSSL 1.0.2-es verzióját, ha már nincs rá szükség.
Telepítse az OpenSSL 1.1.x fájlt, ha a , AesGcm, , DSAOpenSsl, ECDiffieHellmanOpenSsl, ECDsaOpenSslRSAOpenSslvagy SafeEvpPKeyHandle a AesCcmtípust használja.
Ha az OpenSSL interop típusokat egyéni P/Invokes használatával használja, kövesse a SafeEvpPKeyHandle.OpenSslVersion megjegyzésekben található útmutatást.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
- System.Security.Cryptography.AesCcm
- System.Security.Cryptography.AesGcm
- System.Security.Cryptography.DSAOpenSsl
- System.Security.Cryptography.ECDiffieHellmanOpenSsl
- System.Security.Cryptography.ECDsaOpenSsl
- System.Security.Cryptography.RSAOpenSsl
- System.Security.Cryptography.SafeEvpPKeyHandle
.NET Core 1.0
A FileSystemInfo.Attributes által elvetett UnauthorizedAccessException
A .NET Core-ban a rendszer akkor aktiválódik UnauthorizedAccessException , amikor a hívó megpróbál beállítani egy fájlattribútum-értéket, de nem rendelkezik írási engedéllyel.
Módosítás leírása
A .NET-keretrendszer a hívó megpróbálja beállítani a fájlattribútum-értéketFileSystemInfo.Attributes, ArgumentException de nem rendelkezik írási engedéllyel. A .NET Core-ban ehelyett egy UnauthorizedAccessException lesz a dobás. (A .NET Core-ban a rendszer akkor is eldob egy ArgumentException hibát, ha a hívó érvénytelen fájlattribútumot próbál beállítani.)
Bevezetett verzió
1,0
Javasolt művelet
Módosítsa az utasításokat catch
úgy, hogy szükség esetén egy helyett vagy azon kívül is elfogjanak UnauthorizedAccessException egy utasítást ArgumentException.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
A sérült állapot kivételek kezelése nem támogatott
A sérült folyamatállapot-kivételek kezelése a .NET Core-ban nem támogatott.
Módosítás leírása
Korábban a sérült folyamatállapot-kivételeket a felügyelt kódkivétel-kezelők is elkaphatták és kezelhetik, például egy C#-ban található try-catch utasítással.
A .NET Core 1.0-tól kezdődően a sérült folyamatállapot-kivételek nem kezelhetők felügyelt kóddal. A közös nyelvi futtatókörnyezet nem biztosít sérült folyamatállapot-kivételeket a felügyelt kódhoz.
Bevezetett verzió
1,0
Javasolt művelet
Ne kelljen kezelni a sérült folyamatállapot-kivételeket az őket eredményező helyzetek kezelésével. Ha feltétlenül szükséges a sérült folyamatállapot-kivételek kezelése, írja be a kivételkezelőt C vagy C++ kódba.
Kategória
Alapvető .NET-kódtárak
Érintett API-k
- System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute
- legacyCorruptedStateExceptionsPolicy elem
Az UriBuilder tulajdonságai már nem vannak előre felfűzve a bevezető karakterekre
UriBuilder.Fragment már nem fűzi elő a bevezető #
karaktert, és UriBuilder.Query már nem fűzi elő a bevezető ?
karaktert, ha már van ilyen.
Módosítás leírása
A .NET-keretrendszer és a UriBuilder.Fragment UriBuilder.Query tulajdonságok mindig előre fel vannak függve egy #
vagy ?
több karakterre a tárolt értékre. Ez a viselkedés több #
vagy ?
karaktert eredményezhet a tárolt értékben, ha a sztring már tartalmaz ilyen kezdő karaktereket. Előfordulhat például, hogy az érték a UriBuilder.Fragment következő lesz ##main
: .
A .NET Core 1.0-tól kezdődően ezek a #
tulajdonságok már nem használják a tárolt értékre a karaktereket vagy ?
karaktereket, ha a sztring elején már van ilyen.
Bevezetett verzió
1,0
Javasolt művelet
A tulajdonságértékek beállításakor már nem kell explicit módon eltávolítania ezeket a bevezető karaktereket. Ez különösen akkor hasznos, ha értékeket fűz hozzá, mert többé nem kell eltávolítania a bevezetőt #
vagy ?
minden egyes hozzáfűzést.
Az alábbi kódrészlet például a .NET-keretrendszer és a .NET Core közötti viselkedésbeli különbséget mutatja.
var builder = new UriBuilder();
builder.Query = "one=1";
builder.Query += "&two=2";
builder.Query += "&three=3";
builder.Query += "&four=4";
Console.WriteLine(builder.Query);
- A .NET-keretrendszer a kimenet a
????one=1&two=2&three=3&four=4
következő: . - A .NET Core-ban a kimenet a következő
?one=1&two=2&three=3&four=4
: .
Kategória
Alapvető .NET-kódtárak
Érintett API-k
A Process.StartInfo érvénytelenOperationException parancsot ad a nem indult folyamatokhoz
Azoknak a folyamatoknak a Process.StartInfo tulajdonságát olvasva, amelyeket a kód nem kezdett el dobni InvalidOperationException.
Módosítás leírása
A .NET-keretrendszer a kód által nem indult folyamatok tulajdonságának elérése Process.StartInfo egy hamis ProcessStartInfo objektumot ad vissza. A próbabábu objektum az összes tulajdonságának alapértelmezett értékeit tartalmazza, kivéve EnvironmentVariablesa .
A .NET Core 1.0-tól kezdődően, ha egy olyan folyamat tulajdonságát olvassa el Process.StartInfo , amely nem indult el (vagyis hívással Process.Start), a rendszer egy InvalidOperationException hibát jelez.
Bevezetett verzió
1,0
Javasolt művelet
Ne érje el a tulajdonságot azokhoz a Process.StartInfo folyamatokhoz, amelyeket a kód nem kezdett el. Például ne olvassa el ezt a tulajdonságot a visszaadott Process.GetProcessesfolyamatok esetében.
Kategória
Alapvető .NET-kódtárak