【茶包射手日記】看得到吃不到的Visual Studio專案參考程式庫

遇到一個怪異情境: 由他處取得的專案原始碼,編譯時出現錯誤訊息,抱怨專案沒有參考某個第三方元件--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版本是否相容
    (罰寫三遍)
歡迎推文分享:
Published 25 February 2013 09:34 PM 由 Jeffrey
Filed under:
Views: 18,097



意見

# mj said on 01 March, 2013 03:37 PM

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

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<February 2013>
SunMonTueWedThuFriSat
272829303112
3456789
10111213141516
17181920212223
242526272812
3456789
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication