PowerShell 5.1类方法内无法调用[System.Web.HttpUtility]问题求助
PowerShell 5.1类方法内无法使用[System.Web.HttpUtility]的原因及解决办法
问题原因
PowerShell 5.1的脚本执行流程和PowerShell 7存在差异:类定义会在脚本的预解析阶段被优先处理,而Add-Type -AssemblyName System.Web这类加载程序集的命令是在脚本运行阶段才执行。这就导致解析类方法中的[System.Web.HttpUtility]类型时,对应的程序集还未被加载,因此抛出"无法找到类型"的错误。而类外部的代码在运行阶段执行,此时程序集已经加载完成,所以能正常调用。
解决办法
方法一:用using assembly提前加载程序集
using assembly指令会在预解析阶段执行,确保类定义时目标程序集已加载。修改后的代码如下:
using assembly System.Web [System.Web.HttpUtility]::UrlEncode("foo") class Test { [void] Doit() { [System.Web.HttpUtility]::UrlEncode("bar") } } $d = [Test]::new() $d.Doit()
方法二:在类方法内动态加载并反射调用
如果无法使用using assembly,可以在方法内先加载程序集,再通过反射机制调用目标方法:
class Test { [void] Doit() { Add-Type -AssemblyName System.Web $httpUtilityType = [System.Type]::GetType('System.Web.HttpUtility, System.Web') $urlEncodeMethod = $httpUtilityType.GetMethod('UrlEncode', [Type[]][string]) $encodedStr = $urlEncodeMethod.Invoke($null, @("bar")) Write-Host $encodedStr } } $d = [Test]::new() $d.Doit()
方法三:使用内置替代方法实现URL编码
如果仅需完成URL编码功能,可直接使用PowerShell 5.1内置的[Uri]::EscapeDataString()方法,无需加载额外程序集:
class Test { [void] Doit() { $encodedStr = [Uri]::EscapeDataString("bar") Write-Host $encodedStr } } $d = [Test]::new() $d.Doit()
内容的提问来源于stack exchange,提问作者Silex
相关产品推荐
相关产品推荐

