.net 无法加载Exchange powershell管理单元:';Microsoft.Exchange.Data.Directory.Globals';抛出异常

.net 无法加载Exchange powershell管理单元:';Microsoft.Exchange.Data.Directory.Globals';抛出异常,.net,powershell,exchange-server,nlog,exchange-server-2010,.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

我有以下代码,用于创建加载了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以来,我在执行将管理单元添加到运行空间配置的行时开始出现以下错误

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)
我已经能够确认非直瞄发射不知何故导致了这个问题。在创建powershell运行空间之前创建nlog记录器会导致错误

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

  • 我已经尝试在x64和x86中构建该项目
  • 我已重新安装exchange管理工具
  • 我已尝试在exchange环境中的另一台计算机上进行测试
如果有人能提供任何可能帮助我解决这个问题的建议,我将不胜感激


谢谢

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

有关就地更新的更多信息,请参阅以下文章。
这似乎是一个已知的bug。有一个Microsoft connect报告:

微软的回应是,他们已“将[该]问题记录在Exchange团队中”

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

  • 卸载.NET4.5
  • 将应用程序的目标框架更改为2.0或3.5
我的生产服务器有完全相同的问题和相同的错误输出。 但是,我有一个使用.NET4.5框架的测试服务器,具有相同的配置,但没有这个问题。所以我认为卸载.NET4.5不会解决我的问题

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

禁用后,可以创建我的powershell运行空间,可以添加“Microsoft.Exchange.Management.powershell.E2010”管理单元,并且我的应用程序工作正常


似乎存在某种权限问题。

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

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

type.TypeInitializer.Invoke(null, null);

在System.ServiceModel有机会在应用程序域中加载之前。此初始值设定项是一个静态构造函数,每个进程只能运行一次,因此在此之后,如果需要,您可以安全地加载ServiceModel。

嘿,感谢您发布此消息,我遇到了完全相同的问题。因此,我必须卸载.NET4.5。但是-它运行的服务器具有
4.0.30319
-是否确实需要使用2010重做该项目?如果exchange服务器上安装了VS 2012或.NET 4.5,则在4.0中构建的项目中使用.NET 4.5位。只要项目是在.net 4.0中构建的,并且exchange服务器没有安装.net 4.5,您可能仍然可以使用us VS 2012进行开发。在我的例子中,我在exchange server环境中调试了一个VM,必须在该VM上使用VS 2010进行调试。我刚才遇到了相同的问题。。。你知道这方面有什么改进吗?我不再为有这个问题的公司工作了,但这听起来是一个很有希望的解决办法。希望有人能确认这个修复对他们也有效。谢谢分享。很好地解决了这个问题,我的朋友!希望我能早点遇到这个…@Andrei你能详细介绍一下吗?我尝试使用
Assembly.LoadFrom
加载
Microsoft.Exchange.Diagnostics.dll
并获取类型,但在调用
type.TypeInitializer.Invoke(null,null)
时,它仍然引发异常。如果你仍然有代码,你能展示一下你是如何做到的,以及你在代码中的什么地方调用了它吗?以.NET 4.7.2为目标似乎使它大部分消失了,但它仍然偶尔发生(可能是10次中的1次)。