PowerShell使用双脚本方案加载DLL,解决WinSCP类库TypeNotFound错误
报错根本原因
PowerShell执行脚本时会先完成语法和类型解析阶段,再逐行运行代码。你将Add-Type加载DLL的逻辑放在CreateSession函数内部,解析函数代码时WinSCP相关类型还未被加载,就会直接触发类型找不到的错误,和你运行时才执行Add-Type的顺序冲突。
双脚本实现方案
第一步:编写DLL加载脚本(命名为Load-WinSCP.ps1)
这个脚本单独完成DLL加载校验逻辑,避免重复加载,代码如下:
# 校验WinSCPnet.dll路径是否存在 $winscpDllPath = Join-Path $PSScriptRoot "\winscp\WinSCPnet.dll" if (-not (Test-Path $winscpDllPath)) { throw "未找到WinSCP程序集:$winscpDllPath" } # 避免重复加载程序集 if (-not ([System.Management.Automation.PSTypeName]'WinSCP.Protocol').Type) { Add-Type -Path $winscpDllPath | Out-Null }
第二步:主脚本引入加载脚本后调用相关类
主脚本开头先通过点引用的方式加载上述脚本,再执行你的业务逻辑,示例代码如下:
# 点引用加载WinSCP程序集,注意前面的点和空格不可省略 . (Join-Path $PSScriptRoot "Load-WinSCP.ps1") # 后续可以正常调用所有WinSCP类型,不会报类型不存在错误 function CreateSession { try { $this.sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::Sftp HostName = "你的SFTP地址" UserName = "登录账号" Password = "登录密码" SshHostKeyFingerprint = "SFTP主机密钥指纹" } $session = New-Object WinSCP.Session $session.Open($this.sessionOptions) # 后续业务逻辑自行补充 } catch { throw $_ } }
注意事项
- 确保
winscp目录下同时存在WinSCPnet.dll和对应的WinSCP.exe,二者版本必须完全匹配,否则运行时也会触发调用错误 - 双脚本方案兼容PowerShell 5.1及以上所有版本,适用性更强
内容的提问来源于stack exchange,提问作者CamParker
相关产品推荐
相关产品推荐

