Если нет приемлемых ответов, я выложу свои. Надеюсь, это кому-нибудь поможет.
Первый вопрос заключался в том, как среда выполнения разрешает сборки из пакета обновления.
Я немного больше исследовал и прочитал несколько статей. Я по ошибке посмотрел на AssemblyFileVersion
вместо AssemblyVersion
. Для сборок в .NET 2.0 SP
AssemblyFileVersion
это 2.0.50727.1378
, а для сборок из .NET 2.0 RTM
это 2.0.50727.42
. Да, они разные, но это AssemblyFileVersion
, а не AssemblyVersion
. И процесс привязки сборки использует только AssemblyVersion
. Но AssemblyVersion
равно 2.0.0.0
для .NET 2.0 RTM
и .NET SPx
либо. Таким образом, сборки RTM
и SPx
идентичны с точки зрения процесса привязки сборки.
Мне все еще интересно, почему MS не поставляла сборки пакета обновления с увеличенным AssemblyVersion
? Они могут отправлять сборки SP's
с соответствующими политиками Publisher, чтобы перенаправить привязку сборки с RTM
на SP
. И если клиенты хотят использовать RTM
версии сборок, они могут игнорировать политику издателя для определенных сборок. На самом деле, я думаю, что MS отказалась пойти по этому пути, потому что было бы полным беспорядком, если бы клиент начал игнорировать политики издателей на некоторых сборках и не игнорировать на других. Если BCL's
сборки не могут полагаться друг на друга, все BCL
станет несовместимым.
Второй вопрос касался возможности отправки .NET 2.0 SP1
сборок с нашим продуктом и перенаправления привязки сборки с RTM
сборки на SP's
сборки.
Краткий ответ: «Нет, это невозможно». Но есть 2 возможных решения, но они довольно неудачны и могут быть полезны только при строгих обстоятельствах, и в целом они вообще не применимы.
Первое решение состоит в том, чтобы отключить сборку CLR и затем собрать ее заново, но с нашим открытым ключом, иначе мы можем вообще не использовать строгую подпись. Теперь мы сможем ссылаться на эту RTM
сборку, а не на SP's
сборку из GAC.
Второе решение - заменить сборку RTM's
в GAC сборкой SP с помощью инструмента gacutil
. Опция /f
(сила) должна использоваться.
Оба эти решения очень хромые. Пожалуйста, не используйте их. Как правило, их нельзя использовать из-за некоторых зависимостей между сборками.
Заключение
В нашем продукте мы понизили наш продукт, чтобы он мог работать на .NET 2.0 RTM
. Но мы все еще используем некоторые функции даже из .NET 3.x
(linq-to-objects
, Action
, Func
). Мы просто поставляем некоторые сборки 3.x вместе с нашим продуктом, например, System.Core.dll
. В основном у нас нет проблем с этим подходом. Но нам также пришлось отказаться от использования Linq-to-Xml
из-за некоторых неразрешимых проблем.