2012年3月17日

[ASPNET] CS0433之問題

坎尼之前有某個案子的專案在 Debug 的時候很常出現這個問題
所以今天就花了一些時間來追一下問題的發生點

I. 問題說明

此問題發生的時候會出現類似下面的訊息 (可以參考這討論串 

Compiler Error Message: CS0433: The type 'ASP.某個型別' exists in both
'{.Net Framework的路徑}\Temporary ASP.NET Files\root\aaa\bbb\A.dll' and
'{.Net Framework的路徑}\Temporary ASP.NET Files\root\aaa\bbb\B.dll'

CS0433 的官方文件裡寫的很清楚
"在您的應用程式內參考的兩個不同組件包含了相同的命名空間和型別,使其產生了模稜兩可 (Ambiguity) 的情況。"
(但其實 Exception 的內容也講的很清楚了)

只是坎尼檢查了一下專案,感覺不是型別重複的問題
比較像 compiler 快取住某些型別,但重新建置專案之後也只維持一下子
點了幾個頁面之後,有引用到該型別的頁面又會出現此項問題
(都是有引用 Web User Control 的頁面出問題)
(在找解決方法的過程中,發現好像 Web User Control 常會引發這個問題?)


所以坎尼又默默地打開ebay谷歌搜尋
blue-20060625142551

II. 解決方案

首先,在這篇裡提到了3個情況
  1. 不同的 aspx/ascx 引用了相同的 class 當作 code behind 的問題
  2. 因為更名造成有新舊兩種 dll
  3. User Control 的名稱和引用 User Control 的頁面名字一樣

嗯...實際測試之後似乎都不是這些問題,或應該是說,這些都不是主因
坎尼不死心地減少關鍵字,找到了這篇討論串 (其實前面放的討論串也有解法)

解法:在 Web.config 中,把 Compilationbatch 屬性設定為 false

batch 屬性在官方文件的說明為
"If True, eliminates the delay caused by the compilation required when you access a file for the first time. When this attribute is set to True, ASP.NET precompiles all the uncompiled files in a batch mode, which causes an even longer delay the first time the files are compiled. However, after this initial delay, the compilation delay is eliminated on subsequent access of the file."

大意大概是說:當需要該檔案且為第一次進入時才會 compile,以免造成 compile 時間過長,開發人員及客戶都會不爽

所以坎尼猜測就是因為這原因造成下列狀況

  1. A.aspx 引用 UCA.ascx (型別 UCA)
  2. B.aspx 引用 UCA.ascx (型別 UCA)
  3. 進入 A.aspx,進行 compile,沒出現問題
  4. 進入 B.aspx,進行 compile,此時有兩個 .dll 檔都有 UCA 型別

然後系統就混亂了『為什麼有兩個同名的人住在不同的地址,那我到底該去哪個地址找這個人?

『這個地址明明就住大中天,你還要說你是小中天』
dncignn 

III. 小結


不過可能很多人有疑問:為什麼我自己用就好好的,是你自己的問題吧?

其實問題的原因就可能是坎尼之前有做過某些檔案的更名
然後在新增頁面時,就直接把前一頁的程式碼貼過來 (壞習慣啊…)
但也不確定是不是這樣就有可能造成這個問題
畢竟是很久之前的專案,記憶有點久遠…

總之,提供另一個可能 cs0433 的解決方案
希望對同樣遇到這個問題的人有所幫助

沒有留言:

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D