Программа, которую я пишу, использует библиотеку System.Management.Automation
, чтобы использовать классы и интерфейсы powershell, которые там определены. Существуют две версии этих библиотек: 1.0.0.0 и 3.0.0.0. Windows Server 2008 имеет версию GAC версии 1.0 и Windows Server 2012 имеет в своем GAC версии 1.0 и 3.0.
Чтобы иметь возможность использовать эту библиотеку в проекте VS, я должен ссылаться на нее. Теперь это решение сделать, на что я должен ссылаться? Ну, поскольку на обоих серверах есть 1.0 в своем GAC, должно быть безопасно ссылаться на 1.0. Тем не менее, на всякий случай, я скопирую его локально, если есть какой-то редкий (или обычный) случай, когда он не существует в GAC.
Пример использования этой библиотеки:
using (PowerShell PS = PowerShell.Create())
{
PS.AddScript("Import-Module ServerManager")
.Invoke();
}
Команда Import-Module Servermanager
заставляет powershell импортировать другую dll, Microsoft.Windows.ServerManager
. Здесь проблема начинается.
Windows Server 2008 имеет только версию 6.1.0.0 этой библиотеки, где Windows Server 2012 имеет версию 6.3.0.0. я предположим, что Automation
от 1.0 до 6.1 и от 3.0 до 6.3 версия сходства не является совпадением.
Когда я использую свою программу на Windows Server 2008, она работает нормально, но когда я пытаюсь использовать ее в Windows Server 2012, эта сборка Automation 1.0 пытается загрузить сборку ServerManager версии 6.1 (!), которую 2012 doesn ' t есть. 2012 предпочитает использовать сборку Automation v3.0 и загрузить ServerManager v6.3.
Я предполагаю, что есть какой-то способ "рассказать" программе загрузить сборку X, если версия сервера Y и сборка A, если версия сервера B, но куда она идет? Как я могу быть уверен, что я не буду сталкиваться с каким-то сервером, где будет версия 2.0 или 4.0 или что-то еще.
Проблема в том, что я не могу ссылаться (копировать локально) сборку ServerManager, потому что (я думаю), если я могу "сказать" мою программу, где он должен искать сборки, я могу Не сообщайте сборке Automation, где нужно искать другие сборки. Анализируя с помощью procmon, я мог видеть, как он точно знал, где искать, потому что он мгновенно перешел на C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ServerManager
, чтобы найти сборку ServerManager.
Возможные решения, которые я знаю:
-
Я мог бы попытаться динамически загружать сборки, не ссылаясь на них в visual studio, используя объекты
Assembly.Load()
иdynamic
, для которых использование, как мне было предложено, я должен записывать в огненном аду (я полагаю, к этому он чрезвычайно подвержен ошибкам). -
Я могу добавить сборки, которые мне нужны для GAC, но это может привести к некоторому адскому ад, потому что оба Automation и ServerManager могут иметь множество других зависимостей, и я только сейчас обнаружил два из них.
Какие еще параметры у меня есть?