12

我有以下代码创建一个加载了 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)

我已经能够确认 nlog 以某种方式导致了这个问题。在创建 powershell 运行空间之前创建 nlog 记录器的组合会导致错误。

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

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

如果有人可以提供任何可以帮助我解决此问题的建议,我将不胜感激。

谢谢

4

4 回答 4

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

于 2012-09-24T19:01:47.697 回答
4

我已经调查了 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。

于 2017-02-24T15:30:11.003 回答
3

这似乎是一个已知的错误。有一个微软连接报告:

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

微软的回应是他们已经“向 Exchange 团队记录了 [the] 问题”

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

  • 卸载 .NET 4.5
  • 将应用程序的目标框架更改为 2.0 或 3.5。
于 2013-11-25T20:12:11.560 回答
0

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

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

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

似乎它有某种许可问题。

于 2016-11-22T08:57:55.240 回答