VS2012 編譯錯誤: Metadata file 'filename.dll' could not be found

記錄一個不常碰到的編譯錯誤訊息,大概只有使用英文版 Windows 作業系統的人才會碰到吧...

今天把一個先前用 Visual Studio 2012 編譯過的 Windows Forms 應用程式的可執行檔複製到一台 Windows 8 VM 上跑(.NET 4.5),結果執行時出現 DLL 組件格式錯誤或找不到相依組件的錯誤訊息:


由於是自己的程式,我很快就確定這不是找不到相依組件的問題。於是接著用 git clone 把 huanlin.visualstudio.com 的檔案庫拉下來,也是在那台 Windows 8 VM 上,用 Visual Studio 2012 (update 3) 重新 build 整個方案。結果原先編譯都沒問題的程式碼,竟出現一堆錯誤。其中一類錯誤是:

Metadata file 'filename.dll' could not be found.

此錯誤訊息沒有跟任何 .cs 原始程式檔案關聯,也看不出什麼頭緒。

錯誤訊息當中還有另一種是程式檔案裡面包含非法字元。我雙擊此錯誤訊息,將游標帶到出錯的那行程式碼,發現 Visual Studio 2012 的確無法顯示字元,包括中文註解也都變成亂碼。

檢查 Visual Studio 環境設定中的 Text Editor > Auto-detect UTF-8 encoding without signature,是有勾選無誤:


接著到控制台的 Region > Administrative 頁籤查看,發現 Current language for non-Unicode programs 的設定是 English。接著變更系統地區設定為 Chinese (Traditional, Taiwan):


再開啟 Visual Studio 2012,編譯專案,OK! 接著把可執行檔和 DLL 部署一下,執行看看,原先的 DLL 格式錯誤已經消失,程式可以正常執行了。

之所以會發生這類編譯錯誤,我想是因為專案中一部分比較老舊的原始程式碼檔案並非以 UTF-8 編碼方式儲存,而是採用 Chinese Traditional (Big5) - Codepage 950 編碼,同時我的作業系統的語系又設定為 English 所致(Visual Studio 會使用 OS 的語系設定)。

我們可以透過 Visual Studio 主選單的 File > Advanced Save Options 得知目前開啟的程式檔案所採用的編碼,並修改之:


在此對話框把編碼設定改成 UTF-8 之後,再按 Ctrl+S 將檔案儲存即可。

這樣只能一個一個檔案叫出來改,挺費事。如要一次修改多個檔案,還是上網找一下工具來整批處理吧。

順便一提,Visual Studio 環境設定的 Documents 底下有個 Save documents as Unicode when data cannot be saved in codepage 選項:


但它還是只作用於單一檔案儲存時,而且是當 Visual Studio 發現無法以目前 codepage 儲存文件時,才會採用 Unicode 編碼。預設值:不勾選。

Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor