2012-09-18 39 views
12

Tengo el siguiente código que crea un espacio de ejecución de PowerShell con la instantánea de Exchange 2010 cargada.No se puede cargar el complemento de Exchange powershell: el inicializador de tipo para 'Microsoft.Exchange.Data.Directory.Globals' lanzó una excepción

Dim runspaceConfig = RunspaceConfiguration.Create() 

Dim snapInException As PSSnapInException = Nothing 
runspaceConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", snapInException) 

Dim runspace = RunspaceFactory.CreateRunspace(runspaceConfig) 
runspace.Open() 

Desde la instalación de Visual Studio 2012 empecé a recibir el siguiente mensaje de error cuando ejecuta la línea que añade el complemento a la configuración de espacio de ejecución.

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) 

He podido confirmar que nlog de alguna manera está causando este problema. La combinación de crear un registrador nlog antes de crear el espacio de ejecución de powershell da como resultado el error.

Si elimino la sección nlog config de la configuración de mi aplicación y simplemente creo un registrador nlog vacío, el complemento se carga sin error. Además, si dejo la configuración nlog presente en la configuración de mi aplicación pero no creo un registrador nlog, el complemento también se cargó correctamente.

  • He intentado construir el proyecto en x64 y x86.
  • He vuelto a instalar las herramientas de gestión de intercambio.
  • He intentado probar en otra máquina en el entorno de intercambio.

Si alguien puede proporcionarme alguna sugerencia que pueda ayudarme a resolver este problema, lo agradeceré.

que

Respuesta

5

Gracias Después de una investigación más me di cuenta de que .NET 4.5 es una actualización en su lugar lo que significa que .NET 4.0 se sobrescribe y reemplazar con .NET 4.5 cuando se instala. No sé qué cambió en .NET 4.5 que causa esto, pero el problema se resuelve desinstalando .NET 4.5 y volviendo a Visual Studio 2010. Espero que Microsoft tenga alguna actualización en un futuro cercano que resuelva el problema y me permita para usar Visual Studio 2012 nuevamente.

Consulte el siguiente artículo para obtener más información acerca de la actualización en el lugar. http://www.devproconnections.com/article/net-framework/net-framework-45-versioning-faces-problems-141160

+0

Hola, gracias por publicar esto, me estoy encontrando exactamente con el mismo problema. Entonces, tengo que desinstalar .net 4.5. Sin embargo, el servidor en el que se está ejecutando tiene '4.0.30319' - ¿Debo volver a realizar el proyecto con el 2010? – BRogers

+0

Si tiene VS 2012 o .NET 4.5 instalados en el servidor de intercambio, entonces está utilizando .NET 4.5 bits para proyectos integrados en 4.0. Probablemente todavía nos puede VS 2012 para su desarrollo, siempre y cuando el proyecto esté construido en .NET 4.0 y el servidor de intercambio no tenga instalado .NET 4.5. En mi caso, tenía una máquina virtual en el entorno del servidor de intercambio que estaba depurando y tuve que usar VS 2010 en esa máquina virtual para la depuración. –

+0

Tuve el mismo problema hace un momento ... ¿sabes si ha habido alguna mejora en esto? –

0

Tengo exactamente el mismo problema con la misma salida de error con mi servidor de producción. Sin embargo, tengo un servidor de prueba con la misma configuración que usa .Net Framework 4.5 pero que no tiene este problema. Así que no creo que la desinstalación de .Net 4.5 resuelva mi problema.

Mi solución es que he encontrado que en el servidor de producción ASP.Net Impersonation configuración en IIS era habilitado.

Después de que lo desactive, se puede crear mi espacio de ejecución de powershell, se puede agregar el complemento "Microsoft.Exchange.Management.PowerShell.E2010" y mi aplicación está funcionando bien.

Parece que tiene algún tipo de problema de permiso.

+0

Ya no trabajo para la compañía donde tuve este problema, pero parece una solución prometedora. Con suerte, alguien puede confirmar que esta solución también funciona para ellos. Gracias por compartir. –

0

He investigado el error real en los ensamblados de Microsoft Exchange, y el problema fue que la clase ExTraceConfiguration (interna) del ensamblado Microsoft.Exchange.Diagnostics.dll enumera todos los ensamblados cargados en el dominio de la aplicación actual. Si encuentra System.IdentityModel o System.ServiceModel, usa reflection para configurar algún rastreo para ellos. Pero el código de reflexión no es compatible con el .NET 4.5 ServiceModel y se produce un error. Después de que se detecta el error (se verifica una condición nula), se intenta encontrar un rastro, pero el código actualmente se encuentra en el proceso de configuración del rastreo so => ​​hard crash.

La solución es utilizar la reflexión sobre la Microsoft.Exchange.Diagnostics.dll, cargar el tipo ExTraceConfiguration y ejecutar su tipo inicializador:

type.TypeInitializer.Invoke(null, null); 

antes System.ServiceModel ha tenido la oportunidad de cargar sin embargo, en el dominio de tu aplicación Este inicializador es un constructor estático que solo se puede ejecutar una vez por proceso, por lo tanto, después de eso, puede cargar ServiceModel si lo necesita.

Cuestiones relacionadas