舊項目從 .NET Framework 2.0 升級至 3.5,原安裝 Microsoft ASP.NET 2.0 AJAX Extensions。升級後出現兩類衝突:
基類包括字段 "ScriptManager1",但其類型 (System.Web.UI.ScriptManager) 與控件 (System.Web.UI.ScriptManager) 的類型不兼容服務器標記 "asp:ScriptManager" 不明確。請修改導致此多義性的關聯注冊並選取新的標記前綴.NET 3.5 將 AJAX 內建為核心程序集 System.Web.Extensions 3.5.0.0,而舊項目引用 1.0 版本 System.Web.Extensions 1.0.61025.0。兩版本同時存在於 GAC/應用程序域,導致類型標識衝突(同名稱、同命名空間、不同版本)。
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
Namespace="System.Web.UI" TagPrefix="asp" %>
<%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
Namespace="System.Web.UI" TagPrefix="asp" %>
使用編輯器全局搜索替換:Version=1.0.61025.0 → Version=3.5.0.0,涵蓋以下所有節點:
System.Web.Extensions (v1.0) 引用System.Web.Extensions (v3.5.0.0)Copy Local = False(GAC 中已存在)
# 清理 ASP.NET 臨時編譯文件
del /s /q "C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\*"
del /s /q "C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\*"
# 重啟 IIS
iisreset /restart
ScriptManager 頁面,無「不明確」錯誤HttpCompileException 或 AmbiguousMatchException| 誤區 | 後果 | 正確做法 |
|---|---|---|
| 僅替換頁面指令,不改 Web.config | 配置節點仍引用 1.0 版本,衝突持續 | 全量替換所有版本號 |
| 保留 1.0 版本 DLL 在 Bin 目錄 | 運行時加載衝突 | 移除 Bin 目錄舊版本 DLL,依賴 GAC |
| 未清理 Temporary ASP.NET Files | 舊編譯緩存導致類型衝突 | 升級後必須清理緩存 |
| 應用程序池 .NET 版本未切換 | 運行在 2.0 模式,3.5 特性不可用 | 應用程序池設置 .NET CLR Version = v2.0(3.5 運行在 2.0 CLR 上) |
.NET 2.0 → 3.5 升級導致 System.Web.Extensions 版本衝突。核心解法:Web.config 及頁面指令中所有 Version=1.0.61025.0 全量替換為 Version=3.5.0.0,清理 Bin 目錄舊 DLL 與臨時編譯緩存,重啟 IIS。徹底消除雙版本共存引發的類型標識模糊。