​

1. 经过

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

在这里插入图片描述

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

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

总结:我的问题是火绒安全软件通过系统环境变量 APPDOMAIN_MANAGER_ASM 和 APPDOMAIN_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 抛出 FileNotFoundException 和 TypeLoadException
  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社区

更多推荐