1. 经过

最近我发现我的终端打开就报错,查了很久试了挺多方法都不行。
在这里插入图片描述

在这里插入图片描述

后来忙起来就下载了 PowerShell 7.5.4 作为代替,基本平替。

但是当我要在这个电脑里安装 Docker 时,发现下载的安装包点击完全没有反应。
因为急着用 Docker,又是到处乱查、各种问 AI。
终于找到了,解决方法

总结:我的问题是火绒安全软件通过系统环境变量 APPDOMAIN_MANAGER_ASMAPPDOMAIN_MANAGER_TYPE 注入了一个 .NET 钩子 DLL,但该 DLL 文件丢失或损坏,导致所有 .NET 程序启动时都因找不到这个 DLL 而崩溃。

之前我找到的方法都在修复 .NET Framework 本身,但问题不在 .NET,而在于系统环境变量指向了一个不存在的 DLL。

下面是整个解决流程,希望对同样遇到这个问题的朋友提供一点帮助!

2. 问题现象

2.1 主要症状

现象 描述
Docker Desktop 安装程序无响应 双击安装程序后没有任何界面弹出,程序静默退出
Windows PowerShell 5.1 启动失败 报错:“启动 CLR 失败,返回 HRESULT 80131522”,退出代码 -65536
其他 .NET 程序崩溃 所有依赖 .NET Framework 4.x 的程序都无法正常运行

2.2 Windows 事件日志错误

应用程序: Docker Desktop Installer.exe
Framework 版本: v4.0.30319
说明: 由于未经处理的异常,进程终止。
异常信息: System.IO.FileNotFoundException
异常信息: System.TypeLoadException 在 System.AppDomain.CreateAppDomainManager()

3. 问题根本原因

3.1 原因分析

火绒安全软件的 .NET AppDomainManager 注入机制出现故障

火绒安全软件通过设置以下系统环境变量来注入 .NET 钩子,用于监控所有 .NET 程序的运行:

APPDOMAIN_MANAGER_ASM  = System.Collections.Modle, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fffa069857d3563b
APPDOMAIN_MANAGER_TYPE = AppModle

这两个环境变量的作用:

  • APPDOMAIN_MANAGER_ASM:指定要加载的程序集(DLL)名称
  • APPDOMAIN_MANAGER_TYPE:指定 AppDomainManager 的类型名

3.2 故障机制

当 .NET CLR(公共语言运行时)启动任何 .NET 程序时:

  1. CLR 读取 APPDOMAIN_MANAGER_ASM 环境变量
  2. 尝试加载 System.Collections.Modle.dll 文件
  3. 由于该 DLL 文件丢失或损坏,加载失败
  4. CLR 抛出 FileNotFoundExceptionTypeLoadException
  5. 整个 .NET 程序崩溃退出

3.3 为什么 DLL 会丢失?

可能的原因:

  • 火绒软件更新失败或不完整
  • 火绒文件被其他安全软件误删
  • 系统更新或清理工具误删
  • 火绒卸载不完整(删除了 DLL 但未清理环境变量)

注意:即使火绒没有卸载,只要 DLL 文件丢失,问题就会存在!


4. 诊断过程

4.1 第一步:启用 .NET Fusion 程序集绑定日志

管理员 PowerShell 中运行:

# 创建日志目录
New-Item -Path "C:\FusionLog" -ItemType Directory -Force

# 启用 Fusion 日志
reg add "HKLM\SOFTWARE\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Fusion" /v ForceLog /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Fusion" /v LogPath /t REG_SZ /d "C:\FusionLog\" /f
reg add "HKLM\SOFTWARE\Microsoft\Fusion" /v LogFailures /t REG_DWORD /d 1 /f

4.2 第二步:触发错误并查看日志

  1. 运行出错的程序(如双击 Docker 安装程序)

  2. 查看日志目录:

    Get-ChildItem "C:\FusionLog" -Recurse -Filter "*.htm" | Sort-Object LastWriteTime -Descending | Select-Object -First 5 FullName
    
  3. 用浏览器打开 .htm 日志文件

4.3 第三步:分析日志内容

成功的日志示例:

操作成功。
绑定结果: hr = 0x0。操作成功完成。
日志: 通过在 GAC 中查找找到了程序集。

失败的日志示例(关键发现)

操作失败。
绑定结果: hr = 0x80070002。系统找不到指定的文件。

日志: DisplayName = System.Collections.Modle, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fffa069857d3563b
日志: GAC 查找不成功。
日志: 尝试下载新的 URL file:///C:/Users/.../System.Collections.Modle.DLL。
日志: 已尝试所有探测 URLs 但全部失败。

注意 System.Collections.Modle — 这是一个拼写错误的名称(Modle 而不是 Model),且 PublicKeyToken=fffa069857d3563b 不是微软官方的签名。

4.4 第四步:检查系统环境变量

[Environment]::GetEnvironmentVariables("Machine") | Out-String | Select-String "APPDOMAIN"

输出结果:

APPDOMAIN_MANAGER_ASM   System.Collections.Modle, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fffa069857d3563b
APPDOMAIN_MANAGER_TYPE  AppModle

确认了问题根源!


5. 解决方案

5.1 方案一:删除问题环境变量(推荐)

管理员 PowerShell 中运行:

# 删除环境变量
[Environment]::SetEnvironmentVariable("APPDOMAIN_MANAGER_ASM", $null, "Machine")
[Environment]::SetEnvironmentVariable("APPDOMAIN_MANAGER_TYPE", $null, "Machine")

# 验证是否删除成功(应返回空)
[Environment]::GetEnvironmentVariable("APPDOMAIN_MANAGER_ASM", "Machine")
[Environment]::GetEnvironmentVariable("APPDOMAIN_MANAGER_TYPE", "Machine")

然后重启电脑

5.2 方案二:修复火绒(如果想继续使用火绒)

  1. 完全卸载火绒
  2. 重启电脑
  3. 重新下载最新版火绒并安装
  4. 火绒会重新创建正确的 DLL 文件和环境变量配置

5.3 清理 Fusion 日志(可选)

问题解决后,可以关闭 Fusion 日志以节省磁盘空间:

reg delete "HKLM\SOFTWARE\Microsoft\Fusion" /v EnableLog /f
reg delete "HKLM\SOFTWARE\Microsoft\Fusion" /v ForceLog /f
reg delete "HKLM\SOFTWARE\Microsoft\Fusion" /v LogPath /f
reg delete "HKLM\SOFTWARE\Microsoft\Fusion" /v LogFailures /f
Remove-Item -Path "C:\FusionLog" -Recurse -Force

6. 验证修复结果

重启后运行以下命令验证:

# 测试 .NET Framework 是否正常
[System.Environment]::Version

# 测试 Windows PowerShell 5.1
powershell -Command "Write-Host 'PowerShell 5.1 正常工作'"

# 安装 Docker Desktop
& "$env:USERPROFILE\Downloads\Docker Desktop Installer.exe"

7. 相关知识

7.1 什么是 AppDomainManager?

AppDomainManager 是 .NET Framework 提供的一个扩展点,允许第三方软件在 .NET 程序启动时注入自定义代码。安全软件常用此机制来监控 .NET 程序的行为。

7.2 相关环境变量

环境变量 作用
APPDOMAIN_MANAGER_ASM 指定 AppDomainManager 所在的程序集名称
APPDOMAIN_MANAGER_TYPE 指定 AppDomainManager 的完整类型名
COMPLUS_AppDomainManagerAsm 同上,另一种写法
COMPLUS_AppDomainManagerType 同上,另一种写法

7.3 Fusion 日志

Fusion 是 .NET 程序集加载器的名称。启用 Fusion 日志可以详细记录每个程序集的加载过程,是诊断 .NET 程序集加载失败的利器。


8. 经验教训

  1. 安全软件的系统钩子是双刃剑 — 注入机制出问题会导致全局性故障
  2. .NET CLR 启动失败时,优先检查 APPDOMAIN_MANAGER_* 环境变量
  3. Fusion 日志是诊断 .NET 程序集加载问题的最佳工具
  4. 卸载安全软件后要验证环境变量是否清理干净
  5. 遇到诡异的系统问题时,先查看 Windows 事件日志(eventvwr.msc

9. 快速参考命令

# 检查 APPDOMAIN 环境变量
[Environment]::GetEnvironmentVariables("Machine") | Out-String | Select-String "APPDOMAIN"

# 删除问题环境变量
[Environment]::SetEnvironmentVariable("APPDOMAIN_MANAGER_ASM", $null, "Machine")
[Environment]::SetEnvironmentVariable("APPDOMAIN_MANAGER_TYPE", $null, "Machine")

# 启用 Fusion 日志
reg add "HKLM\SOFTWARE\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Fusion" /v ForceLog /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Fusion" /v LogPath /t REG_SZ /d "C:\FusionLog\" /f

# 查看 Windows 事件日志中的 .NET 错误
Get-WinEvent -LogName Application -MaxEvents 20 | Where-Object { $_.Message -like "*Framework*" }

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐