Не удается загрузить оснастку 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.
- Я переустановил инструменты управления обменом.
- Я попробовал тестирование на другой машине в среде обмена.
Если кто-нибудь может предложить какие-либо предложения, которые могут помочь мне решить эту проблему, я буду благодарен.
Спасибо
Ответы
Ответ 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, если вам это нужно.