.net 无法加载Exchange powershell管理单元:';Microsoft.Exchange.Data.Directory.Globals';抛出异常
我有以下代码,用于创建加载了Exchange 2010管理单元的PowerShell运行空间.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
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李>
似乎存在某种权限问题。我已调查了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次)。