我使用PowerShell脚本直接在脚本中运行C#代码。我曾多次遇到某个错误的错误。如果我对PowerShell ISE中的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")
。我有一种方法可以防止这种错误发生,而无需更改名称空间和方法调用吗?
答案 0 :(得分:9)
据我所知,一旦添加了PowerShell会话,就无法从PowerShell会话中删除该类型。
我建议的(烦人的)解决方法是在一个ISE会话中编写代码,并在完全不同的会话中执行它(如果您希望能够调试,则单独的控制台窗口或单独的ISE)。
这只会在你改变$Source
时(主动开发类型定义)。如果那不是正在改变的部分,那么忽略错误,如果它是终止错误,请使用-ErrorAction
进行更改。
答案 1 :(得分:2)
您可以将其作为工作执行:
$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" )
答案 2 :(得分:1)
对于那些想要避免错误或如果已经加载了类型的人,请使用以下检查:
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。
答案 3 :(得分:0)
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()"