已加载程序集后,PowerShell无法通过名称添加类型的问题求助
咱们先理清楚这个矛盾点:明明已经确认程序集加载到当前AppDomain了,为啥用Add-Type -AssemblyName还会找不到它?
问题根源
当你用Add-Type -LiteralPath加载程序集时,它确实把程序集加载到了当前PowerShell的运行环境里,但Add-Type -AssemblyName的查找逻辑不一样——它默认只会去**全局程序集缓存(GAC)**或者PowerShell的默认搜索路径(比如当前目录、系统默认路径)里找程序集,不会直接从已经加载到内存的AppDomain中匹配短名称。所以哪怕程序集已经在内存里,只用Oracle.ManagedDataAccess这个短名称调用Add-Type -AssemblyName还是会失败。
解决办法
这里有几个实用的方案,你可以根据需求选择:
方案1:直接使用已加载的程序集类型(最推荐)
既然程序集已经在内存里了,完全不需要再用Add-Type重复加载,直接通过完整命名空间的类型名调用即可,或者先枚举程序集里的类型:
- 直接实例化类型(比如创建Oracle连接对象):
# 用完整命名空间调用类型 $oracleConn = New-Object Oracle.ManagedDataAccess.Client.OracleConnection - 如果不确定具体类型名,可以先列出程序集里的所有类型:
# 定位已加载的Oracle程序集 $oracleAssembly = [appdomain]::CurrentDomain.GetAssemblies() | Where-Object {$_.FullName -match 'Oracle.ManagedDataAccess,'} # 列出所有可用类型及其命名空间 $oracleAssembly.GetTypes() | Select-Object Name, Namespace
方案2:使用完整程序集标识调用Add-Type
如果你一定要用Add-Type -AssemblyName,可以传入程序集的完整标识(包含版本、公钥令牌等信息),而不是只用短名称:
$oracletpe = Add-Type -AssemblyName 'Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342' -PassThru
这个完整标识就是你通过GetAssemblies查到的结果,PowerShell能通过它精准匹配到已加载的程序集。
方案3:将程序集安装到GAC(适合长期频繁使用)
如果这个Oracle程序集是你日常工作经常用到的,可以把它安装到全局程序集缓存里,这样以后用Add-Type -AssemblyName Oracle.ManagedDataAccess就能直接找到它。操作需要管理员权限,命令如下:
# 使用gacutil安装(需确保gacutil在系统路径中,通常在VS工具目录下) gacutil /i "\\crtwfaadvlkv0.d2dbfg.com\PRODUCTION\Vision\Apps\VisionPipeline\Oracle.ManagedDataAccess.dll"
内容的提问来源于stack exchange,提问作者user1443098

