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

Не удается загрузить оснастку Exchange Powerhell: инициализатор типа для "Microsoft.Exchange.Data.Directory.Globals" выбрал исключение

У меня есть следующий код, который создает рабочую среду PowerShell с включенной привязкой Exchange 2010.

Dim runspaceConfig = RunspaceConfiguration.Create()

Dim snapInException As PSSnapInException = Nothing
runspaceConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", snapInException)

Dim runspace = RunspaceFactory.CreateRunspace(runspaceConfig)
runspace.Open()

С момента установки Visual Studio 2012 я начал получать следующую ошибку при выполнении строки, которая добавляет оснастку в конфигурацию рабочей области.

System.Management.Automation.Runspaces.PSSnapInException occurred
  HResult=-2146233087
  Message=Cannot load Windows PowerShell snap-in Microsoft.Exchange.Management.PowerShell.E2010 because of the following error: The type initializer for 'Microsoft.Exchange.Data.Directory.Globals' threw an exception.
  Source=System.Management.Automation
  WasThrownFromThrowStatement=False
  StackTrace:
       at System.Management.Automation.Runspaces.RunspaceConfigForSingleShell.LoadCustomPSSnapIn(PSSnapInInfo mshsnapinInfo)
       at System.Management.Automation.Runspaces.RunspaceConfigForSingleShell.LoadPSSnapIn(PSSnapInInfo mshsnapinInfo)
       at System.Management.Automation.Runspaces.RunspaceConfigForSingleShell.LoadPSSnapIn(PSSnapInInfo mshsnapinInfo, PSSnapInException& warning)
       at System.Management.Automation.Runspaces.RunspaceConfigForSingleShell.DoAddPSSnapIn(String name, PSSnapInException& warning)
       at System.Management.Automation.Runspaces.RunspaceConfiguration.AddPSSnapIn(String name, PSSnapInException& warning)

Я смог подтвердить, что nlog каким-то образом вызывает эту проблему. Сочетание создания регистратора nlog до создания пробела powershell приводит к ошибке.

Если я удалю раздел nlog config из моей конфигурации приложения и просто создаю пустой регистратор nlog, тогда оснастка загружается без ошибок. Кроме того, если я оставляю конфигурацию nlog в конфигурации моего приложения, но не создаю регистратор nlog, оснастка также успешно загружена.

  • Я попытался построить проект как в x64, так и в x86.
  • Я переустановил инструменты управления обменом.
  • Я попробовал тестирование на другой машине в среде обмена.

Если кто-нибудь может предложить какие-либо предложения, которые могут помочь мне решить эту проблему, я буду благодарен.

Спасибо

4b9b3361

Ответ 1

После дальнейшего изучения я понял, что .NET 4.5 является обновлением на месте, что означает, что .NET 4.0 перезаписана и заменена .NET 4.5 при установке. Я не знаю, что изменилось в .NET 4.5, что вызывает это, но проблема устранена путем удаления .NET 4.5 и перехода на Visual Studio 2010. Надеемся, что в ближайшем будущем у Microsoft будет некоторое обновление, которое решит проблему и позволит мне снова использовать Visual Studio 2012.

Более подробную информацию о обновлении на месте см. в следующей статье. http://www.devproconnections.com/article/net-framework/net-framework-45-versioning-faces-problems-141160

Ответ 2

Кажется, это ошибка. Существует отчет Microsoft connect:

https://connect.microsoft.com/VisualStudio/feedback/details/770748/powershell-exception-after-4-5-upgrade#tabs

Ответ Microsoft заключается в том, что они "зарегистрировали [проблему] с командой Exchange"

В качестве обходного пути вы можете выполнить одно из следующих действий:

  • Удалить .NET 4.5
  • Измените целевую структуру приложения на 2.0 или 3.5.

Ответ 3

У меня точно такая же проблема с тем же выходом ошибки с моим сервером. Тем не менее, у меня есть тестовый сервер с той же конфигурацией с использованием .Net 4.5 framework, но без этой проблемы. Поэтому я не думаю, что удаление .Net 4.5 решит мою проблему.

Мое решение: я обнаружил, что на сервере настройка ASP.NET Impersonation в IIS была включена.

После того, как я отключу его, можно создать мою рабочую среду powershell, добавлена ​​возможность загрузки "Microsoft.Exchange.Management.PowerShell.E2010", мое приложение работает нормально!

Похоже, что у него есть какая-то проблема с разрешением.

Ответ 4

Я исследовал фактическую ошибку в сборках Microsoft Exchange, и проблема заключалась в том, что класс ExTraceConfiguration (внутренний) из сборки Microsoft.Exchange.Diagnostics.dll перечисляет все загруженные сборки в текущем домене приложения. Если он находит System.IdentityModel или System.ServiceModel, он использует отражение, чтобы настроить для них некоторую трассировку. Но код отражения несовместим с .net 4.5 ServiceModel и возникает ошибка. После обнаружения ошибки (проверяется нулевое условие) проверяется трассировка, но в настоящее время код находится в процессе настройки трассировки so = > ​​hard crash.

Решение состоит в том, чтобы использовать отражение в файле Microsoft.Exchange.Diagnostics.dll, загрузить тип ExTraceConfiguration и запустить его инициализатор типа:

type.TypeInitializer.Invoke(null, null);

прежде чем System.ServiceModel имеет возможность загрузить еще в вашем домене приложения. Этот инициализатор является статическим конструктором, который может запускаться только один раз для каждого процесса, поэтому после этого вы можете загрузить ServiceModel, если вам это нужно.