2013-10-31 56 views
3

我已經用Visual Studio 2012在Windows 7機器上編寫了一個.NET 4.5應用程序,它在Windows 7上安裝並運行良好。在Windows 7和8中不同的.NET 4.5?

當我嘗試在Windows 8機器上部署它時,它非常災難性地崩潰,在事件查看器中沒有非常有用的輸出。
跟蹤依賴Walker暗示它無法在一個/某些核心窗口dll中找到方法。 例如:

LoadLibraryExW("C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscoreei.dll", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned 0x00007FFDEA780000. 
GetProcAddress(0x00007FFDEA780000 [MSCOREEI.DLL], "RegisterShimImplCallback") called from "MSCOREE.DLL" at address 0x00007FFDEA82F3A9 and returned 0x00007FFDEA783444. 
GetProcAddress(0x00007FFDEA780000 [MSCOREEI.DLL], "RegisterShimImplCleanupCallback") called from "MSCOREE.DLL" at address 0x00007FFDEA82F3BC and returned NULL. Error: The specified procedure could not be found (127). 

當檢查mscoreei.dll,我注意到:

Windows 7計算機
v4.0.30319.18408
613456字節

視窗8機
v4.0.30319.33440
633,424 b (ASoft .NET version detector)有.NET 4.5 Full。

爲什麼我的機器有不同的.NET版本,以及如何確保我的Windows 7機器上的編譯器指向Windows 8機器的正確版本?

+1

在運行沒有更多的信息,第三方DLL猜測 - 服務包/安全補丁。運行Windows更新,也許? – Bridge

+1

@Bridge:我已經在兩個窗口上運行了一百萬次。 – DefenestrationDay

+1

我看到您標記了Windows 8.1,它隨.net 4.5.1一起提供,但在Windows 7上使用Visual Studio 2012,它隨.net 4.5.0一起提供,這就是版本號不同的原因。不知道爲什麼它會失敗災難性的! – JMK

回答

1

看起來,無論是在您的代碼或第三方DLL中的某處,LOAD_WITH_ALTERED_SEARCH_PATH值都被使用。

這是因爲LoadLibraryEx函數被調用某處。這進口kernel32.dllwhich is different in Windows 7 compared to Windows 8

LOAD_WITH_ALTERED_SEARCH_PATH在錯誤was already deprecated in Windows 7中提到,它可能是Windows 8根本不存在的。

我認爲你需要在Windows 8.1上安裝Visual Studio,並從那裏調試你的代碼,直到你遇到異常。它可能會幫助你找出問題比在7上編譯更快的問題,並試圖破譯隱藏的錯誤消息時嘗試在8上運行。一旦找到問題庫,您可以聯繫供應商,看他們是否有更新版本。

+0

建議您嘗試在8.1上進行調試。不幸的是,它編譯和運行完全相同的項目文件和源... – DefenestrationDay

+0

在8.1上編譯的版本是否在7上拋出相同的錯誤? – JMK

+0

完全沒有錯誤。沒問題。代碼是相同的(它由8.1機器在7機器硬盤上編譯)。該項目現在針對.NET 4.5。 – DefenestrationDay

5

是的,這是完全正常的。 Windows 8還具有.NET 3.5的自定義版本。沒有什麼不尋常的,.NET Framework確實對操作系統版本有很大的依賴性。它的原因預裝在Windows 8上。

對於MSCoree來說,這種依賴關係尤其值得注意,它是.NET框架的「裝載程序shim」。它吸引了一個非常戲劇性的特技,它可以讓Windows從32位EXE文件創建一個64位進程。這並不簡單,它與Windows中的加載程序密切合作以實現這一目標,修補內部數據結構以創建64位進程。

看到「無法找到指定的程序」錯誤也沒有什麼不尋常的。這就是爲什麼它使用GetProcAddress()而不是隱式導入依賴關係。使用GetProcAddress()是一種非常常見的技術,可以確定某個特定的api函數是否實際上受支持。

我認真地懷疑你發現你的程序崩潰的真正原因。永遠不要忘記實現AppDomain.CurrentDomain.UnhandledException事件來報告未處理的異常,從Windows獲取的崩潰信息是毫無用處的。

0

這是不是一個特別有用的答案 - 但它是一個說無法處理正在X64的過程在Win 8 上究竟是什麼造成了實際問題

相關問題