遇到一個怪異情境: 由他處取得的專案原始碼,編譯時出現錯誤訊息,抱怨專案沒有參考某個第三方元件--Quartz.dll。但如下圖範例,右側專案參考清單中明明有Quartz這顆元件,但左側using Quartz卻回應找不到Quartz命名空間,光視覺上就很矛盾!

其實過去已有類似經驗,問題多與.NET Framework版本有關,例如: .NET 2.0專案參考.NET 4.0元件、或是.NET 4.0 Client Profile專案參考.NET 4.0元件時就會產生這種結果。而詭異的是,該顆Quartz.dll元件在同一解決方案的其他專案中也有用到,卻能順利編譯無誤。

該專案的輸出目錄設定為X:\Boo\bin,屬性視窗顯示Quartz的Path為X:\Boo\bin\Debug\Quartz.dll,經確認檔案存在。試著移除Quartz參考重新加入參考,跟另一個專案採用的同一個Quartz.dll來源,如此Quartz參考屬性視窗的Path會指向新來源,但問題依舊。

靈光一現,打開Error List的Warning顯示切換(由於Warning常多到把Error淹沒,由於Warning多半不影響執行,故習慣關啟較能聚焦Error),冒出了以下Warning:

繞了大半天,還是.NET版本問題!! 原來Quartz.dll用了.NET 3.5,但有問題的專案是.NET 2.0,再仔細看那個可順利編譯專案--.NET 3.5!! 問題終究還是出在.NET Framework平台版本,但原先未料想同一解決方案中並存不同.NET版本專案,才一時迷惑! 且慢,還有一個謎團未解,若元件.NET版本不相容,前人為何能編譯成功呢? 最後,在.csproj找到答案:

<Reference Include="Quartz, Version=2.0.1.100, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\..\..\..\src\Quartz.NET\bin\Release\Quartz.dll</HintPath>
</Reference>

真相大白,在前一位開發者環境裡專案會參照自行修改過的Quartz客製版,在我的電腦上自然沒有相對的目錄與檔案,於是Visual Studio很聰明地自行改參考\bin\Debug下的Quartz.dll,而該目錄下的Quartz.dll則為另一個專案寫入的2.0.100版,生出了這枚茶包。

【心得】

  1. 當Visual Studio遇到.csproj中DLL指定路徑不存在,會自動改指向bin目錄下的檔案。(今天才發現這點,慚愧!)
  2. 未來遇到"已參考元件,using時卻產生找不到"的情況:
    請立即檢查專案與元件的.NET版本是否相容
    請立即檢查專案與元件的.NET版本是否相容
    請立即檢查專案與元件的.NET版本是否相容
    (罰寫三遍)

Comments

# by mj

有些code明明用3.5的寫法,只是用4.0編,但是3.5就是不能用...異常的機車,以前只要care 1.1跟2.0....現在多出了3.5、4.0、4.0 Client....寫的元件庫為了要讓公司內各式專案可以用,硬是要長出5條code line.....苦手阿~~~

Post a comment