You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell:解决重复加载程序集报错,如何正确检查已加载状态

问题分析与解决方案

你的检查逻辑失效核心有两点:

  1. 依赖ManifestModule.Name匹配不可靠——该值可能因加载方式、平台差异(如跨平台部署的命名变化)或影子复制机制出现不一致,导致误判程序集未加载。
  2. 多运行空间并发存在竞态条件:多个运行空间同时检查到程序集未加载,随后先后执行加载操作,第二个操作触发"Assembly with same name is already loaded"错误。

正确的检查与加载方式

方式一:通过程序集全名精确匹配检查

先获取目标DLL的唯一标识(FullName,包含名称、版本、公钥令牌等),再检查AppDomain中是否存在该程序集:

# 获取目标程序集的全名(含版本、公钥等唯一信息)
$targetAssemblyFullName = [System.Reflection.AssemblyName]::GetAssemblyName("C:\ProgramData\ExampleApp\HtmlAgilityPack.dll").FullName

# 检查AppDomain中是否已加载该程序集
if (-not ([System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.FullName -eq $targetAssemblyFullName })) {
    [Reflection.Assembly]::LoadFrom("C:\ProgramData\ExampleApp\HtmlAgilityPack.dll") | Out-Null
}

这种方式能精确匹配同一程序集,避免重名DLL误判,但仍需注意竞态条件——多运行空间同时执行时仍可能出现重复加载。

方式二:利用.NET内置加载机制(推荐)

使用Assembly.Load()替代LoadFrom(),该方法会自动检查AppDomain中是否已加载相同标识的程序集,存在则直接返回已加载实例,不存在才执行加载,且内部处理了并发安全,彻底避免竞态问题:

try {
    # 获取目标程序集的名称标识
    $assemblyName = [System.Reflection.AssemblyName]::GetAssemblyName("C:\ProgramData\ExampleApp\HtmlAgilityPack.dll")
    # 由.NET自动处理加载逻辑,已加载则直接返回,无重复加载报错
    [System.Reflection.Assembly]::Load($assemblyName) | Out-Null
}
catch [System.IO.FileNotFoundException] {
    # 处理DLL不存在的异常
    Write-Error "HtmlAgilityPack.dll 文件未找到,请检查路径是否正确"
}

这种方式无需手动编写检查逻辑,完全依赖.NET的程序集加载管理,是多运行空间环境下最可靠的方案。

内容的提问来源于stack exchange,提问作者Vjz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:54:18