PowerShell: почему я могу загружать несколько версий одной и той же сборки .NET за один сеанс, а также «обходить ад завиC#

Место общения программистов C#
Ответить
Anonymous
 PowerShell: почему я могу загружать несколько версий одной и той же сборки .NET за один сеанс, а также «обходить ад зави

Сообщение Anonymous »

Я работаю в Windows 10 x64, PowerShell версии 5.1.
У меня есть несколько версий сборки .NET Framework 4.0 (.dll), написанной на C# (сам) ). Сборки не подписаны. Их версии задаются в файле AssemblyInfo.cs через [assembly: AssemblyVersion("X.X.X.X")]. Тег [assembly: AssemblyFileVersion("X.X.X.X")] не существует в моем файле AssemblyInfo.cs! Эти сборки используются в обычном приложении .NET Framework, они не являются специализированными модулями PowerShell и не имеют файлов манифеста.
Я использую эту сборку в некоторых сценариях PowerShell для создания объектов и вызова методов. из него.
У меня есть две версии этой сборки, скажем 1.1.1.100 и 1.2.1.100. Когда я импортирую, скажем, версию 1.1.1.100 в PowerShell через модуль импорта «D:\path\to_v1.1\MyAssembly.dll», все работает нормально. Когда я вызываю Get-Module, я вижу в списке эту импортированную сборку:

Код: Выделить всё

ModuleType Version    Name
---------- -------    ----
Binary     1.1.1.100  MyAssembly
Теперь начинается самое интересное. Я импортирую другую версию сборки Import-Module "D:\another\path\to_v1.2\MyAssembly.dll". Это снова работает просто отлично. Итак, вот мои вопросы:
Вопрос 1. Почему не отображаются ошибки? Я ожидаю получить ошибку: я пытаюсь загрузить сборку с тем же именем, но другой версией. Я думал, что нельзя загрузить две разные версии одной и той же сборки в одном контексте. Как обрабатываются такие ситуации, какие контексты загрузки используются? Может быть, вторая версия вообще не загружена?
Q2. Get-Module теперь показывает два модуля с то же имя и версия, вот так:

Код: Выделить всё

ModuleType Version    Name
---------- -------    ----
Binary     1.1.1.100  MyAssembly
Binary     1.1.1.100  MyAssembly
Не имеет значения, какую версию я импортирую первой. Во втором модуле Import-Module самая ранняя импортированная версия дублируется в списке Get-Module. Я также могу использовать типы/методы только из самой ранней импортированной версии сборки.
Q3. Моя сборка имеет некоторые зависимости от других моих сборок (в та же папка). Эти зависимости автоматически разрешаются и неявно «импортируются» в текущий сеанс (я могу без проблем использовать их типы). Каждая версия основного файла MyAssembly.dll зависит от разных версий этих вторичных сборок. Когда я импортирую другую версию MyAssembly, я также не получаю ошибок о конфликтующих версиях. Еще раз: я могу использовать только типы из самых ранних импортированных вторичных сборок. Я читал об «аде зависимостей», и это должно быть невозможно – так как же это возможно?
Я провел тот же эксперимент с пакетом NuGet Microsoft.CodeAnaанализ.CSharp.dll, версии 3.4.0 и 3.11.0. Результаты те же: версии и их зависимости импортируются без проблем, но доступна только самая ранняя импортированная версия.
Резюме
Когда я импортирую разные версии одних и тех же сборок, ошибок не возникает, доступны только самые ранние импортированные версии. Я хочу понять, почему я могу без ошибок загружать несколько версий сборки за один сеанс, как PowerShell вообще справляется с такими ситуациями и почему он показывает два модуля с одинаковыми версиями, почему я этого не делаю не попаду в ад зависимости.
Я хочу понять, что происходит, а не просто «заставить это работать».
Что мне здесь не хватает?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/689 ... ssembly-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»