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"). Я могу предотвратить эту ошибку, не меняя пространство имен и вызов метода?

686   2  

2 ответов:

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

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

Это имеет значение только в том случае, если вы изменяете $Source (активно разрабатывая определение типа). Если это не та часть, которая меняется, то игнорируйте ошибки, если это конечная ошибка использования -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" )

Comments

    Ничего не найдено.