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

Справочник системных библиотек для платформы PowerShell и модуля диспетчера сервера

Программа, которую я пишу, использует библиотеку 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 могут иметь множество других зависимостей, и я только сейчас обнаружил два из них.

Какие еще параметры у меня есть?

4b9b3361

Ответ 1

Вы пытались перенаправить перенаправление в файл .config для этих ссылок?

  <runtime>
    <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>