PowerShell添加类型:无法添加类型,已存在

ekqde3dh  于 2022-12-18  发布在  Shell
关注(0)|答案(6)|浏览(273)

我正在使用PowerShell脚本直接在脚本中运行C#代码。我已经运行了几次错误。如果我在PowerShell伊势中对C#代码进行任何更改并尝试再次运行它,我会得到以下错误。

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

我解决这个错误的方法是更改命名空间和命令来调用C#方法[AlertsOnOff10.onOff]::Main("off")。有没有方法可以防止这个错误发生,而不必更改命名空间和方法调用?

nimxete2

nimxete21#

对于那些想要避免错误或避免加载已经加载的类型的用户,请使用以下检查:

if ("TrustAllCertsPolicy" -as [type]) {} else {
        Add-Type "using System.Net;using System.Security.Cryptography.X509Certificates;public class TrustAllCertsPolicy : ICertificatePolicy {public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) {return true;}}"
        [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
}

我发布这个是因为如果你对C#代码做了哪怕是表面的(例如,格式化)更改,你都会得到错误OP。

mdfafbf1

mdfafbf12#

据我所知,一旦添加了类型,就无法将其从PowerShell会话中删除。
我建议的(烦人的)变通方法是在一个伊势会话中编写代码,然后在一个完全不同的会话中执行它(如果您希望能够调试,可以使用单独的控制台窗口或单独的ISE)。
这只在你修改$Source的时候才有关系(积极地开发类型定义),如果这不是修改的部分,那么忽略错误,或者如果它是一个终止错误,使用-ErrorAction来修改它。

5lwkijsr

5lwkijsr3#

您可以将其作为作业执行:

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

7qhs6swi4#

Adam Furmanek的blog有最简单和最好的解决方法,如下所示,如果你想知道如何传入参数,你可以看到https://samtran.me/2020/02/09/execute-c-code-with-parameters-using-powershell/

$id = get-random
$code = @"
using System;
namespace HelloWorld
{
    public class Program$id
    {
        public static void Main(){
            Console.WriteLine("Hello world again!");
        }
    }
}
"@

Add-Type -TypeDefinition $code -Language CSharp 
Invoke-Expression "[HelloWorld.Program$id]::Main()"
4xrmg8kj

4xrmg8kj5#

简单的解决方案是关闭Powershell并重新打开它。使用Add-Type添加的类型将在关闭时删除,然后再次运行代码。

vq8itlhq

vq8itlhq6#

代替

./YourScript.ps1

使用此命令

powershell.exe -ExecutionPolicy ByPass -Command "./YourScript.ps1"

相关问题