我有以下代码,可以在加载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记录器,则管理单元也会成功加载。
如果有人能提供任何可以帮我解决这个问题的建议,我会很高兴。
谢谢
答案 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连接报告:
微软的回应是他们“已经与Exchange团队签署了问题”
作为解决方法,您可以执行以下操作之一:
答案 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,我的应用程序工作正常!
似乎有某种许可问题。