如何将参数类型声明为必须显式加载的 .NET Framework 类型?

How do I declare a parameter type as a .NET framework type that must be explicitly loaded?

我希望能够将 System.Drawing 中的 Color 类型传递到我的 PowerShell 脚本中。但是,除非我在我的脚本 运行 之前明确加载 System.Drawing.dll 并且我不想让人们这样做。

除非我在脚本之外加载 dll,否则我会收到此错误:

Unable to find type [System.Drawing.Color]

我的 PowerShell Param 声明如下所示:

Param(
    [Parameter(Mandatory = $true)][string] $TargetFile,
    [Parameter()][int] $Thickness = 1,
    [Parameter()][Switch] $UseTopLeftColor = $false,
    [Parameter()][System.Drawing.Color] $BorderColor = [System.Drawing.Color]::FromArgb(195,195,195)
)

加载DLL引用的代码是这样的:

[Void][System.Reflection.Assembly]::LoadFile("C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll")

如何为脚本定义对 DLL 的依赖并让它自动引用 DLL?

Add-Type只是[Reflection.Assembly]::LoadFile()更方便的写法。两者都不能在脚本中 Param() 之前使用。

如果您希望能够从任何地方运行 PowerShell 脚本,我建议为每种基本颜色指定一个参数,然后在脚本中计算颜色。这样您还可以验证每个值:

Param(
  [Parameter(Position=0)]
  [ValidateRange(0,255)]
  [int]$BorderRed = 195,
  [Parameter(Position=1)]
  [ValidateRange(0,255)]
  [int]$BorderGreen = 195,
  [Parameter(Position=2)]
  [ValidateRange(0,255)]
  [int]$BorderBlue = 195
)

Add-Type -Assembly 'System.Drawing'

[Drawing.Color]::FromArgb($BorderRed, $BorderGreen, $BorderBlue)

尝试将颜色指定为单个参数的 3 个值的列表将难以实现。从 PowerShell 外部您不能真正将数组传递给参数,因此您必须指定类似逗号分隔的字符串并将其解析为 3 个整数值。

虽然可以将颜色名称作为单个参数传递:

Param(
  [Parameter()]
  [string]$BorderColor = 'Blue'
)

Add-Type -Assembly 'System.Drawing'

[Drawing.Color]::$BorderColor