Когда я анализирую эти файлы и передаю их CSharpCompilation, он возвращает диагностические сообщения сумки, подобные этому :
Код: Выделить всё
c:\xyz\SomeFile.cs(8,1): error CS1056: Unexpected character '�'
Код: Выделить всё
private static readonly List s_specificDiagnosticOptions = new[]
{
// Assembly 'AssemblyName1' uses 'TypeName' which has a higher version than referenced assembly 'AssemblyName2'
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/CS1705
"CS1705",
// Assuming assembly reference "Assembly Name #1" matches "Assembly Name #2", you may need to supply runtime policy
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/CS1701
"CS1701",
// Assuming assembly reference "Assembly Name #1" used by "Type Name #1" matches identity "Assembly Name #2" of "Type Name #2", you may need to supply runtime policy
"CS1702",
// 'member1' hides inherited member 'member2'. Use the new keyword if hiding was intended
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs0108
"CS0108",
// The member 'member' does not hide an inherited member. The new keyword is not required
// https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0109
"CS0109",
// 'function1' hides inherited member 'function2'. To make the current method override that implementation, add the override keyword. Otherwise add the new keyword.
// https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0114
"CS0114",
// The result of the expression is always 'value1' since a value of type 'value2' is never equal to 'null' of type 'value3'
// https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0472
"CS0472",
// 'class' overrides Object.Equals(object o) but does not override Object.GetHashCode()
// https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0659
"CS0659",
// Unreachable code detected
// https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0162
"CS0162",
// Invalid name for a preprocessing symbol; '' is not a valid identifier
"CS8301",
// The annotation for nullable reference types should only be used in code within a '#nullable' annotations context
"CS8632",
// The using directive for 'XYZ' appeared previously as global using
"CS8933",
// Unnecessary using directive
"CS8019",
// 'member' is obsolete
// https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0612
"CS0612",
// 'member' is obsolete: 'text'
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/CS0618
"CS0618"
}.Select(id => new KeyValuePair(id, ReportDiagnostic.Suppress)).ToList();
...
public static SyntaxTree ParseBytes(this byte[] bytes, CSharpParseOptions options, string filePath) => CSharpSyntaxTree.ParseText(SourceText.From(bytes, bytes.Length), options, filePath);
...
var compilation = CSharpCompilation.Create(asmProps.AssemblyName,
csFiles.Select(o => o.Bytes.ParseBytes(parseOptions, o.FilePath)),
references,
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary,
assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default,
generalDiagnosticOption: ReportDiagnostic.Error,
specificDiagnosticOptions: s_specificDiagnosticOptions));
Объект CSharpParseOptions просто содержит константы определения и указывает последнюю версию языка.
Как я могу проинструктировать CSharpCompiler не волноваться, увидев неразрывные пробелы? Я с осторожностью отношусь к простому подавлению CS1056, это кажется неправильным.
EDIT 1
I внимательно изучил ситуацию. Сначала я решил очистить все исходные файлы, содержащие 0xA0 или комбинацию 0xC2A0. Но это слишком дорого (тысячи файлов) и избыточно — 99,9% этих файлов не терпят неудачу при компиляции. Не знаю почему. Но есть один файл, который не работает.
У него нет спецификации. Он содержит символы 0xA0 (не двухбайтовую последовательность 0xC2A0):
Этот файл четко отображается в Notepad++ (что указывает на кодировку ASCII). Сборка из командной строки тоже работает нормально.
Но кодировка UTF8 действительно не может правильно ее представить:
[img]https:// i.sstatic.net/jtcyulKF.png[/img]
Честно говоря, мне этот файл кажется неудачным, но у меня есть проблема — он компилируется в командной строке! В противном случае его бы не отправили на мастер-класс из-за нашей политики построения связей с общественностью.
Я знаю, что могу его очистить, но как мне узнать, какие файлы вообще нужно очищать? Обычно я не запускаю компиляцию с диагностикой, потому что это значительно замедляет ее, и я знаю, что все файлы в мастере должны пройти компиляцию, поэтому я могу позволить себе пропустить диагностику.
Идеи о том, как это сделать разрешите мою проблему в общем и эффективном порядке.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ing-spaces
Мобильная версия