Версия .NET 4.0 сделала большое изменение в способе сборки ссылок на базу. Ранее эталонная сборка была простой копией сборки времени выполнения, той, которая хранится в GAC. Это, однако, вызвало некоторые болезненные проблемы. Примечательна перегрузка WaitHandle.WaitOne(int)
, она была добавлена в обновление .NET 2.0 с пакетом обновления 2 (ака .NET 3.5). Программисты использовали его, не заметив, что это добавленный метод , номер версии сборки mscorlib все еще был 2.0.0.0. Но затем они обнаружили, что их программа завершилась неудачей при запуске на неподдерживаемой версии .NET 2.0. Очень неприятный kaboom, MissingMethodException без подсказки, почему такой общий метод может отсутствовать.
Чтобы предотвратить этот разрыв, сборки ссылок .NET 4.0 сохраняются отдельно, в разделе «% programfiles%\reference Assemblies ", как вы узнали. И они - специальные сборки, они содержат только метаданные со всеми ИЛ. Вот почему сборка намного меньше.
Microsoft теперь может улучшить код .NET 4 и добавить общедоступные классы и методы, не вызывая такого рода поломки. И сделали это обильно, обновления 4.01, 4.02 и 4.03 отправлены с момента выпуска оригинала 4.0.
Причина, по которой у вас возникают проблемы с классом DataContractSerializerSetting
, легко объясняется, она просто не появляется в контрольной сборке. Он добавлен, вероятно, в одном из этих дополнительных обновлений. И вы не должны пытаться, ваша программа будет ломаться на машине, у которой нет обновления. Вы должны подождать до .NET 4.5, версии, которая добавила его в ссылочную сборку. Вы можете вызвать DLL Hell, если хотите.
Если вы хотите, чтобы sed
не учитывался, например. Арабские символы должны быть алфавитными (они есть), вам нужно установить локаль, которая их не учитывает.
Локаль «C» учитывает только базовый набор символов, т. Е. Только [A-Za-z]
являются алфавитными , Я предполагаю, что вы хотите удалить все, что не является символом этого диапазона (ваш вопрос нечеткий о том, что вы действительно хотите):
echo -e "A \xd8\xa8" | LC_CTYPE=C sed -r "s/[^[:alpha:]]//g" | hexdump -C
Выход:
00000000 41 0a
00000002
Необработанный текст:
$ echo -e 'A \xd8\xa8' | od -c
0000000 A 330 250 \n
0000005
Удалить символы не-ascii:
$ echo -e 'A \xd8\xa8' | sed 's/[^\x00-\x7F]//g' | od -c
0000000 A \n
0000003
Удалить пробелы:
$ echo -e 'A \xd8\xa8' | sed 's/[[:space:]]//g' | od -c
0000000 A 330 250 \n
0000004
Удалить символы не-ascii и пробелы:
$ echo -e 'A \xd8\xa8' | sed 's/[^\x00-\x7F]//g; s/[[:space:]]//g' | od -c
0000000 A \n
0000002
$ echo -e 'A \xd8\xa8' | sed -E 's/[^\x00-\x7F]|[[:space:]]//g' | od -c
0000000 A \n
0000002
... | LC_ALL=C sed '...'
), так как быстрый Google показывает, что люди сообщают об этой ошибке в некоторых локалях и рекомендуют использовать локаль C для ее исправления.
– Ed Morton
13 July 2018 в 16:16
Попробуйте следующее:
$ echo -e "A \xd8\xa8 ña ñe ño áÄãç " | sed -r "s/[^a-zA-Z0-9]//g"
Aaeo
Альтернативой будет печать всего диапазона ASCII (но символа пробела и управляющих символов):
$ echo -e "A \xd8\xa8 ña ñe ño áÄãç " | sed -r "s/[^\x21-\x7F]//g"
Aaeo
sed
, не влияя на вызывающую среду. И переменные среды LC_ / LANG - это i> способ установки языкового стандарта. Это может показаться «сложным». для вас, но то, что вы хотите, - это i> другой язык. – DevSolar 13 July 2018 в 12:42