Не удается загрузить оснастку PowerShell для Exchange: инициализатор типа для "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 я начал получать следующую ошибку при выполнении строки, которая добавляет оснастку в конфигурацию runspace.
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 из конфигурации моего приложения и просто создаю пустой регистратор nlog, то оснастка загружается без ошибок. Кроме того, если я оставлю конфигурацию nlog в конфигурации моего приложения, но не создаю регистратор nlog, оснастка также будет успешно загружена.
- Я попытался построить проект в x64 и x86.
- Я переустановил инструменты управления обменом.
- Я пробовал тестировать на другой машине в среде обмена.
Если кто-то может дать какие-либо предложения, которые могут помочь мне решить эту проблему, я буду очень рад.
Спасибо
4 ответа
После дальнейшего изучения я выяснил, что.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
Я исследовал фактическую ошибку в сборках Microsoft Exchange, и проблема заключалась в том, что класс ExTraceConfiguration (внутренний) из сборки Microsoft.Exchange.Diagnostics.dll перечисляет все загруженные сборки в текущем домене приложения. Если он находит System.IdentityModel или System.ServiceModel, он использует отражение для настройки некоторой трассировки для них. Но код отражения не совместим с.net 4.5 ServiceModel, и возникает ошибка. После обнаружения ошибки (проверяется нулевое условие) выполняется попытка трассировки, но код в настоящее время находится в процессе настройки трассировки, так что => hard crash.
Решение состоит в том, чтобы использовать отражение в Microsoft.Exchange.Diagnostics.dll, загрузить тип ExTraceConfiguration и запустить его инициализатор типа:
type.TypeInitializer.Invoke(null, null);
до того, как System.ServiceModel имел возможность загрузить еще в вашем домене приложения. Этот инициализатор является статическим конструктором, который может выполняться только один раз для каждого процесса, поэтому после этого вы можете безопасно загрузить ServiceModel, если вам это нужно.
Кажется, это известная ошибка. Существует отчет Microsoft Connect:
Ответ Microsoft заключается в том, что они "зарегистрировали проблему с командой Exchange"
В качестве обходного пути вы можете сделать одно из следующих действий:
- Удалите.NET 4.5
- Измените целевую платформу вашего приложения на 2.0 или 3.5.
У меня точно такая же проблема с той же ошибкой на моем рабочем сервере. Однако у меня есть тестовый сервер с такой же конфигурацией, использующий.Net 4.5 framework, но не имеющий этой проблемы. Поэтому я не думаю, что удаление.Net 4.5 решит мою проблему.
Мое решение заключается в том, что я обнаружил, что на рабочем сервере параметр олицетворения ASP.Net в IIS был включен.
После того, как я отключу его, моё рабочее пространство PowerShell может быть создано, можно добавить оснастку "Microsoft.Exchange.Management.PowerShell.E2010", и мое приложение работает нормально!
Похоже, что это имеет какую-то проблему с разрешением.