PowerShell Add-Type: не удается добавить тип. уже существовать

Я использую сценарий PowerShell для запуска кода C# непосредственно в скрипте. Я столкнулся с ошибкой, определенной ошибкой несколько раз. Если я внесу какие-либо изменения в код C# в PowerShell ISE и попытаюсь запустить его снова, я получу следующую ошибку.

Add-Type : Cannot add type. The type name 'AlertsOnOff10.onOff' already exists.
At C:UserstestUserDesktoptest.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

способ устранения этой ошибки заключается в изменении пространства имен и команды для вызова метода c#[AlertsOnOff10.onOff]::Main("off"). Я могу предотвратить эту ошибку, не меняя пространство имен и метод позвонить?

2 ответов


насколько мне известно, невозможно удалить тип из сеанса PowerShell после его добавления.

(раздражающий) обходной путь, который я бы предложил, - написать ваш код в одном сеансе ISE и выполнить его в совершенно другом сеансе (отдельное окно консоли или отдельный ISE, если вы хотите иметь возможность отлаживать).

это имеет значение только если ты меняешь $Source though (активно разрабатывает определение типа). Если это не та часть, которая меняется, тогда игнорируйте ошибки, если это конечная ошибка использования -ErrorAction чтобы изменить его.


вы можете выполнить его как задание:

$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" )