Подтвердить что ты не робот

Справочная сборка и разные сборки с той же версией

У меня есть проект, который использует сборку System.Runtime.Serialization. Я использую тип DataContractSerializer из этой сборки, но у меня есть проблема. Есть две сборки:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Runtime.Serialization.dll

C:\Windows\Microsoft.net\Framework\v4.0.30319\System.Runtime.Serialization.dll

Оба они имеют одну и ту же версию - v4.0.30319. Первый имеет размер 429kb, а второй - 1037kb. Я использовал рефлектор, чтобы увидеть список классов, и у первого нет класса, который мне нужен (DataContractSerializerSettings). Однако второй имеет его.

Почему существует какая-то большая разница в размерах и классах для этой сборки? Будет ли это нормально, если я использую второй, а не первый?

4b9b3361

Ответ 1

Версия .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, если хотите.