Visual Studio 2010 裝好之後,我把之前寫的一個 Visual Studio 2008 類別庫專案開起來,跟以往一樣,VS2010 會出現專案升級精靈。專案完成升級之後,我在解決方案中加入了一個新專案(Demo01),嘗試寫點範例程式,去呼叫既有的類別庫(MyLib)。結果編譯此新專案時出現底下的警告和錯誤訊息:
Error: The type or namespace name 'MyLib' could not be found (are you missing a using directive or an assembly reference?) D:\Demo2010\MyLib\Demo01\Program.cs
Warning: The referenced assembly "D:\Demo2010\MyLib\Bin\Debug\MyLib.dll" could not be resolved because it has a dependency on "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which is not in the currently targeted framework ".NETFramework,Version=v4.0,Profile=Client". Please remove references to assemblies not in the targeted framework or consider retargeting your project.
原來 MyLib 這個類別庫專案的 Target Framework 仍是維持 .NET Framework 3.5(專案升級時不會動到這個設定),而新建立的範例程式專案的 Target Framework 是 .NET Framework 4 Client Profile。關鍵在於 MyLib 專案有用到 ASP.NET 相關類別,而 .NET Framework 4 Client Profile 並未包含 ASP.NET。
解決方法很簡單:把新建立的範例程式專案的 Target Framework 改成 .NET Framework 4 就行了。當然,如果有完整原始碼,最好也一併把既有類別庫專案的 Target Framework 都改成 .NET Framework 4,以免碰到一些怪問題。例如,我後來胡亂玩了一下,把其他舊專案打開來,反覆切換各相依專案的 Target Framework 版本,有一次編譯時卻看到這樣的警告訊息:
The primary reference "Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
在 Microsoft Connect 網站上有看到一個解法:在 Solution Explorer 中展開編譯失敗的專案的 References 項目,找到錯誤訊息所提示的組件參考,將屬性 Specific Version 由 False 改為 True,然後 rebuild 專案。參考下圖:
試了一下,的確可以解決編譯時的警告訊息,但無論後來再怎麼試,都無法再重現這個問題。也許不重要,多半是我胡亂調整設定的緣故吧。
重點是,如果有一天碰到這種情況:明明有加入組件參考,編譯時卻出現找不到型別或命名空間的錯誤--此時就可以檢查一下,看看是不是參考的組件使用了 Client Profile 未包含的 .NET 組件,並且嘗試將目前的專案的 Target Framework 改成完整的 .NET Framework。
相關文章:
Error: The type or namespace name 'MyLib' could not be found (are you missing a using directive or an assembly reference?) D:\Demo2010\MyLib\Demo01\Program.cs
Warning: The referenced assembly "D:\Demo2010\MyLib\Bin\Debug\MyLib.dll" could not be resolved because it has a dependency on "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which is not in the currently targeted framework ".NETFramework,Version=v4.0,Profile=Client". Please remove references to assemblies not in the targeted framework or consider retargeting your project.
原來 MyLib 這個類別庫專案的 Target Framework 仍是維持 .NET Framework 3.5(專案升級時不會動到這個設定),而新建立的範例程式專案的 Target Framework 是 .NET Framework 4 Client Profile。關鍵在於 MyLib 專案有用到 ASP.NET 相關類別,而 .NET Framework 4 Client Profile 並未包含 ASP.NET。
解決方法很簡單:把新建立的範例程式專案的 Target Framework 改成 .NET Framework 4 就行了。當然,如果有完整原始碼,最好也一併把既有類別庫專案的 Target Framework 都改成 .NET Framework 4,以免碰到一些怪問題。例如,我後來胡亂玩了一下,把其他舊專案打開來,反覆切換各相依專案的 Target Framework 版本,有一次編譯時卻看到這樣的警告訊息:
The primary reference "Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
在 Microsoft Connect 網站上有看到一個解法:在 Solution Explorer 中展開編譯失敗的專案的 References 項目,找到錯誤訊息所提示的組件參考,將屬性 Specific Version 由 False 改為 True,然後 rebuild 專案。參考下圖:
試了一下,的確可以解決編譯時的警告訊息,但無論後來再怎麼試,都無法再重現這個問題。也許不重要,多半是我胡亂調整設定的緣故吧。
重點是,如果有一天碰到這種情況:明明有加入組件參考,編譯時卻出現找不到型別或命名空間的錯誤--此時就可以檢查一下,看看是不是參考的組件使用了 Client Profile 未包含的 .NET 組件,並且嘗試將目前的專案的 Target Framework 改成完整的 .NET Framework。
相關文章:
沒有留言: