2012-09-18 12 views
12

Ho il seguente codice che crea uno spazio di esecuzione di PowerShell con lo snap in Exchange 2010 caricato.Impossibile caricare lo snap-in PowerShell di Exchange: l'inizializzatore di tipo per "Microsoft.Exchange.Data.Directory.Globals" ha generato un'eccezione

Dim runspaceConfig = RunspaceConfiguration.Create() 

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

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

Poiché l'installazione di Visual Studio 2012 ho cominciato ottenere il seguente errore durante l'esecuzione della linea che aggiunge lo snap-in per la configurazione spazio di esecuzione.

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) 

Sono stato in grado di confermare che nlog è in qualche modo causa questo problema. La combinazione della creazione di un logger nlog prima della creazione dello spazio di esecuzione di PowerShell genera l'errore.

Se rimuovo la sezione di configurazione nlog dalla mia app config e creo solo un logger nlog vuoto, lo snap-in viene caricato senza errori. Inoltre, se esco dalla configurazione di nlog presente nella configurazione dell'app ma non creo un logger nlog, anche lo snap-in viene caricato correttamente.

  • Ho provato a creare il progetto sia in x64 che in x86.
  • Ho reinstallato gli strumenti di gestione degli scambi.
  • Ho provato a provare su un'altra macchina nell'ambiente di scambio.

Se qualcuno può fornire qualche suggerimento che possa aiutarmi a risolvere questo problema, sarò grato.

si

risposta

5

Grazie Dopo ulteriori indagini ho capito che .NET 4.5 è un aggiornamento sul posto significa che .NET 4.0 viene sovrascritto e sostituirli con .NET 4.5 una volta installato. Non so cosa sia cambiato in .NET 4.5 che causa questo problema, ma il problema è risolto disinstallando .NET 4.5 e tornando a Visual Studio 2010. Speriamo che Microsoft abbia qualche aggiornamento nel prossimo futuro che risolverà il problema e mi permetterà utilizzare nuovamente Visual Studio 2012.

Vedere il seguente articolo per ulteriori informazioni sull'aggiornamento sul posto. http://www.devproconnections.com/article/net-framework/net-framework-45-versioning-faces-problems-141160

+0

Ehi, grazie per aver postato questo, mi sto imbattendo nello stesso identico problema. Quindi, devo disinstallare .net 4.5. Tuttavia - il server su cui è in esecuzione ha '4.0.30319' - Devo ripetere il progetto con il 2010 per sicuro? – BRogers

+0

Se sul server Exchange è installato VS 2012 o .NET 4.5, si utilizzano .NET 4,5 bit per i progetti creati in 4.0. Probabilmente puoi ancora noi VS 2012 per il tuo sviluppo finché il progetto è integrato in .net 4.0 e il server di scambio non ha .NET 4.5 installato. Nel mio caso, avevo una VM nell'ambiente del server di Exchange da cui eseguivo il debug e dovevo utilizzare VS 2010 su quella VM per il debug. –

+0

Ho avuto lo stesso problema solo ora ... sai se ci sono stati dei miglioramenti? –

0

Ho esattamente lo stesso problema con lo stesso errore di output con il mio server di produzione. Tuttavia, ho un server di prova con la stessa configurazione che utilizza il framework .Net 4.5 ma che non presenta questo problema. Quindi non penso di disinstallare. Net 4.5 risolverà il mio problema.

La mia soluzione è che ho trovato sul server di produzione ASP.L'impostazione Impersonificazione rete in IIS era abilitata.

Dopo averlo disabilitato, è possibile creare lo spazio di esecuzione di PowerShell, è possibile aggiungere lo snap-in "Microsoft.Exchange.Management.PowerShell.E2010" e la mia applicazione funziona correttamente!

Sembra che abbia una sorta di problema di autorizzazione.

+0

Non lavoro più per l'azienda in cui ho avuto questo problema ma sembra una soluzione promettente. Speriamo che qualcuno possa confermare che questa correzione funziona anche per loro. Grazie per la condivisione. –

0

Ho studiato il bug effettivo negli assembly di Microsoft Exchange e il problema era la classe ExTraceConfiguration (interna) dall'assembly Microsoft.Exchange.Diagnostics.dll enumera tutti gli assembly caricati nel dominio dell'app corrente. Se trova System.IdentityModel o System.ServiceModel, utilizza la reflection per configurarne la traccia. Ma il codice di riflessione non è compatibile con il .Model .net 4.5 e si verifica un errore. Dopo che l'errore è stato rilevato (viene verificata una condizione nulla) viene tentata una traccia, ma il codice è attualmente in fase di configurazione della traccia così => hard crash.

La soluzione è quella di utilizzare la riflessione sul Microsoft.Exchange.Diagnostics.dll, caricare il tipo ExTraceConfiguration ed eseguirlo è inizializzatore di tipo:

type.TypeInitializer.Invoke(null, null); 

prima System.ServiceModel ha avuto la possibilità di caricare ancora in il tuo dominio dell'app. Questo inizializzatore è un costruttore statico che può essere eseguito solo una volta per processo, quindi dopo di ciò è possibile caricare ServiceModel in caso di necessità.