2014-09-08 13 views
8

Używam skryptu PowerShell do uruchamiania kodu C# bezpośrednio w skrypcie. Kilka razy wystąpił błąd, który spowodował błąd. Jeśli wprowadzę jakiekolwiek zmiany w kodzie C# w PowerShell i spróbuję uruchomić go ponownie, pojawia się następujący błąd.PowerShell Add-Type: Nie można dodać typu. już istnieje

Add-Type : Cannot add type. The type name 'AlertsOnOff10.onOff' already exists. 
At C:\Users\testUser\Desktop\test.ps1:80 char:1 
+ Add-Type -TypeDefinition $Source -ReferencedAssemblies $Assem 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (AlertsOnOff10.onOff:String) [Add-Type], Exception 
    + FullyQualifiedErrorId : TYPE_ALREADY_EXISTS,Microsoft.PowerShell.Commands.AddTypeCommand 

Sposób, w jaki zostały rozwiązania tego błędu jest przez zmianę nazw i polecenie, aby zadzwonić do C# metody [AlertsOnOff10.onOff]::Main("off"). W jaki sposób mogę zapobiec wystąpieniu tego błędu bez konieczności zmiany przestrzeni nazw i wywołania metody?

+1

Proponuję za pomocą VS i ex. aplikacja konsolowa do rozwijania i debugowania złożeń. PowerShell może używać zarządzanego kodu, ale nie jest przeznaczony do zastępowania VS (co jest świetnym uzupełnieniem). –

+0

Czy to pomoże? Oczywiście, jeśli zmieni się definicja twojego typu, to nie pomoże, ale może to być obejście problemu, jeśli nie planujesz przedefiniować typu: http://stackoverflow.com/questions/16552801/how-do-i-conditionally-add -a-class-with-add-type-typedefinition-if-it-isnt-add – OffHeGoes

Odpowiedz

8

Zgodnie z moją wiedzą nie ma możliwości usunięcia typu z sesji PowerShell po jej dodaniu.

Proponowane (irytujące) obejście problemu polega na napisaniu kodu w jednej sesji ISE i wykonaniu go w zupełnie innej sesji (osobne okno konsoli lub oddzielne oprogramowanie ISE, jeśli chcesz mieć możliwość debugowania).

Mimo to zmienia się tylko $Source (aktywnie rozwijając definicję typu). Jeśli to nie jest ta część, która się zmienia, zignoruj ​​błędy, jeśli jest to błąd kończący się, zmień go na -ErrorAction.

+1

Z mojego rozumienia, jeśli zamknę swoją sesję ISE, nie napotkam tego błędu. Czy to jest poprawne? – zingwing

+0

Tak, to prawda. – Matt

+0

Uzgodnione; zamknięcie ISE i ponowne otwarcie powinno działać. – briantist

0

Można wykonać ją jako zadanie:

$cmd = {  

    $code = @' 
     using System; 

     namespace MyCode 
     { 
      public class Helper 
      { 
       public static string FormatText(string message) 
       { 
        return "Version 1: " + message; 
       } 
      } 
     } 
'@ 

    Add-Type -TypeDefinition $code -PassThru | Out-Null 

    Write-Output $([MyCode.Helper]::FormatText("It Works!")) 
} 

$j = Start-Job -ScriptBlock $cmd 

do 
{ 
    Receive-Job -Job $j 

} while ($j.State -eq "Running") 
Powiązane problemy