2015-02-12 257 views
0

我在Visual Studio 2012中的解決方案有三個項目。一個WinForms項目和兩個VC++項目(庫)。最初所有的開發都是在Windows 7 Professional 32 Bit上完成的。但最近,我的系統已更新爲Windows 7 Professional 64位。從32位變爲64位

我的應用程序通過設置爲AnyCPU的Active Solution Platform成功運行。但是,當應用程序啓動時,我執行了一些調用底層VC++庫的操作,該應用程序崩潰時,dll的FileNotFoundException

那麼我應該將主動解決方案平臺更改爲x64?或者可以保持原樣。

我試圖將活動解決方案平臺更改爲x64。但該DLL沒有建立。我得到一個error LNK2019: unresolved external symbol

我從來沒有使用過64位之前。我應該怎樣做我的應用程序構建?

未找到的符號出現在靜態庫的第三個VC++項目中。

WinForms依賴於dll,而dll依賴於靜態lib。

更新:

當構建配置設置爲AnyCPU,我得到一個System.BadImageFormatException。根據其他信息,它說無法加載文件或程序集dll_name,....。嘗試加載格式不正確的程序。

+0

爲什麼你不告訴我們更多關於你遇到的錯誤。什麼符號沒有解決? – 2015-02-12 04:43:20

+0

除非應用程序在64位模式下運行有令人信服的理由,否則將其保留爲32位可能會更簡單。這意味着將主動解決方案平臺設置爲x86。 – 2015-02-12 05:06:42

+1

64位進程無法調用32位dll,反之亦然。你必須確保程序中的所有調用函數都是64位版本 – 2015-02-12 05:11:34

回答

1

AnyCPU平臺的選擇建立CPU獨立的.NET代碼。這意味着它將在32位Windows上作爲x86代碼運行,但在64位Windows上作爲x64代碼運行。

Visual C++沒有AnyCPU的任何等價物。這些項目必須是32位或64位。據推測,您的解決方案配置爲在AnyCPU被選中時將它們構建爲32位DLL。這意味着在64位機器上,.NET代碼將以64位運行,但DLL仍然是32位,並且由於64位進程無法加載32位DLL,因此它獲勝沒有工作。

您可以通過將Active Solution Platform設置爲x64或將其設置爲x86來修復此。除非你有特定的原因讓代碼以x64運行(例如,它需要更大的地址空間,或者它在32位平臺上不能很好地運行),否則選擇x86通常會更簡單,因爲這樣做會起作用在32位和64位Windows上,並且不需要對最初爲32位Windows開發的現有代碼進行任何修改。

也可以在單個解決方案中構建32位和64位DLL並在運行時加載.NET代碼。但是,這更復雜。