2015-10-05 2 views
5

Ho il seguente cmdlet scritto in C#, è fondamentalmente solo genera un errore:Come funziona ThrowTerminatingError in C#?

[Cmdlet("Use", "Dummy")] 
public class UseDummyCmdlet :PSCmdlet 
{ 
    protected override void ProcessRecord() 
    { 
     var errorRecord = new ErrorRecord(new Exception("Something Happened"), "SomethingHappened", ErrorCategory.CloseError, null); 
     ThrowTerminatingError(errorRecord); 
    } 
} 

sto assumendo (potrei sbagliarmi), questo è l'equivalente in PowerShell)

Function Use-Dummy() 
{ 
    [CmdletBinding()] 
    Param() 

    process 
    { 
     $errorRecord = New-Object System.Management.Automation.ErrorRecord -ArgumentList (New-Object System.Exception), 'SomethingHappened', 'NotSpecified', $null 
     $PSCmdlet.ThrowTerminatingError($errorRecord) 
    } 
} 

la versione di PowerShell si comporta come ci si aspettava:

Use-Dummy : Exception of type 'System.Exception' was thrown. 
At line:1 char:10 
+ use-dummy <<<< 
    + CategoryInfo   : NotSpecified: (:) [Use-Dummy], Exception 
    + FullyQualifiedErrorId : SomethingHappened,Use-Dummy 

la versione C# tuttavia, si blocca, con le seguenti informazioni:

An exception of type 'System.Management.Automation.PipelineStoppedException' occurred in System.Management.Automation.dll but was not handled in user code 

Additional information: The pipeline has been stopped. 

Cosa sto sbagliando?

+0

Cosa ti aspettavi? C# non è un linguaggio di scripting - quando si colpisce un'eccezione non gestita, il programma si arresta in modo anomalo. –

+0

Mi aspetto un risultato identico. Il codice fa ESATTAMENTE la stessa cosa, solo in lingue diverse. Entrambi possono essere eseguiti in PowerShell, voglio solo sapere perché la pipeline viene improvvisamente chiusa quando si esegue la versione C# e non la versione di PowerShell. – Jake

+0

Come si usa questo cmdlet? Si trova in un modulo/snap-in o è aggiunto dinamicamente? Come lo chiami? Dalla console PowerShell, ISE, un'altra applicazione? Cosa significa "arresti anomali"? –

risposta

1

Posso confermare, si tratta di un problema di ambiente e uno maledetto.

Fondamentalmente se si seguono le istruzioni here, quindi andare a eseguire il debug di eventuali moduli binari, se si chiama ThrowTerminatingError, si blocca con PipelineStoppedException.

Ora ho bisogno di qualche tipo di correzione/soluzione.

Modifica: trovato una correzione, selezionare 'abilita il debug del codice nativo' nelle proprietà del progetto.