无法加载Exchange PowerShell管理单元:' Microsoft.Exchange.Data.Directory.Globals'的类型初始值设定项。抛出一个例外

时间:2012-09-18 15:44:16

标签: .net powershell exchange-server nlog exchange-server-2010

我有以下代码,可以在加载Exchange 2010快照时创建PowerShell运行空间。

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是以某种方式导致此问题。在创建powershell运行空间之前创建nlog记录器的组合会导致错误。

如果我从应用程序配置中删除nlog配置部分并只创建一个空的nlog记录器,则加载该管理单元时没有错误。此外,如果我在应用程序配置中保留nlog配置但不创建nlog记录器,则管理单元也会成功加载。

  • 我尝试在x64和x86中构建项目。
  • 我重新安装了交换管理工具。
  • 我尝试在交换环境中的另一台机器上进行测试。

如果有人能提供任何可以帮我解决这个问题的建议,我会很高兴。

谢谢

4 个答案:

答案 0 :(得分:5)

经过进一步调查后,我发现.NET 4.5是一个就地更新意味着.NET 4.0被覆盖并在安装时替换为.NET 4.5。我不知道.NET 4.5中发生了什么变化导致了这个问题,但是通过卸载.NET 4.5并切换回Visual Studio 2010解决了这个问题。希望微软在不久的将来会有一些更新来解决问题,并允许我再次使用Visual Studio 2012。

有关就地更新的详细信息,请参阅以下文章。 http://www.devproconnections.com/article/net-framework/net-framework-45-versioning-faces-problems-141160

答案 1 :(得分:3)

这似乎是一个知道错误。有一个Microsoft连接报告:

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

微软的回应是他们“已经与Exchange团队签署了问题”

作为解决方法,您可以执行以下操作之一:

  • 卸载.NET 4.5
  • 将应用程序的目标框架更改为2.0或3.5。

答案 2 :(得分:1)

我已经调查了Microsoft Exchange程序集中的实际错误,问题是来自Microsoft.Exchange.Diagnostics.dll程序集的ExTraceConfiguration类(内部)枚举了当前应用程序域中的所有已加载程序集。如果它找到System.IdentityModel或System.ServiceModel,它使用反射为它们配置一些跟踪。但是反射代码与.net 4.5 ServiceModel不兼容,并且发生错误。检测到错误(检查空条件)后,尝试跟踪,但代码当前正在配置跟踪,所以=>>硬碰撞。

解决方案是在Microsoft.Exchange.Diagnostics.dll上使用反射,加载ExTraceConfiguration类型并运行它的类型初始值设定项:

type.TypeInitializer.Invoke(null, null);

在System.ServiceModel有机会在您的应用域中加载之前

。这个初始化程序是一个静态构造函数,每个进程只能运行一次,所以如果需要,可以安全地加载ServiceModel。

答案 3 :(得分:0)

我的生产服务器的错误输出与我的问题完全相同。 但是,我有一个使用.Net 4.5框架的相同配置的测试服务器,但没有这个问题。所以我不认为卸载.Net 4.5会解决我的问题。

我的解决方案是,我发现IIS中的生产服务器 ASP.Net模拟设置已启用

我禁用它后,可以创建我的powershell运行空间," Microsoft.Exchange.Management.PowerShell.E2010"可以添加snapin,我的应用程序工作正常!

似乎有某种许可问题。