簡體   English   中英

當我在一台機器上開發EXE並在另一台機器上運行它時,為什么安裝vcredist_x86.exe不會修復SideBySide錯誤?

[英]Why installing vcredist_x86.exe doesn't fix SideBySide error when I develop an EXE on one machine and run it on another one?

問題

我在Windows XP Professional版本2002 Service Pack 3上使用Microsoft Visual Studio 2005 Verison 8.0.50727.762(SP.050727-7600)編寫了一個名為'Foo'的C ++項目。我將項目構建到Foo.exe中。 然后,我將文件Foo.exe復制到Windows Server 2003企業版Service Pack 2.當我嘗試運行它時,它失敗並出現此錯誤,

C:\foo.exe
The application has failed to start because the application configuration is incorrect.
Reinstalling the application may fix the problem.

在事件查看器>系統中,記錄了三個事件。

事件ID:32; 資料來源:SideBySide

Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was
The referenced assembly is not installed on your system.

事件ID:59; 資料來源:SideBySide

Resolve Partial Assembly failed for Microsoft.VC80.CRT.
Reference error message: The referenced assembly is not installed on your system.

事件ID:59; 資料來源:SideBySide

Generate Activation Context failed for C:\foo\Foo.exe.
Reference error message: The referenced assembly is not installed on your system.

安裝Microsoft Visual C ++ 2005 Redistributable沒有修復它

  1. http://www.microsoft.com/download/en/details.aspx?id=3387下載了vcredist_x86.exe
  2. 安裝好了。 安裝程序創建了一個名為C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd的文件夾。

從“添加或刪除程序”中找到的該軟件版本為“8.0.50727.42”。

在嘗試運行C:\\ foo \\ foo.exe時,我得到了與上述相同的錯誤。

安裝Microsoft Visual C ++ 2005 SP1 Redistributable沒有修復它

  1. http://www.microsoft.com/download/en/details.aspx?id=5638下載了vcredist_x86.exe
  2. 安裝好了。 安裝程序創建了一個名為C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700的文件夾。

從“添加或刪除程序”中找到的該軟件版本為“8.0.56336”。

在嘗試運行C:\\ foo \\ foo.exe時,我得到了與上述相同的錯誤。

從同一台機器(我正在運行EXE)復制CRT DLL和清單並沒有解決它。

  1. 我將msvcm80.dllmsvcp80.dllmsvcr80.dllC:\\WINDOWS\\WinSxS\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acdC:\\foo
  2. 接下來,我將C:\\WINDOWS\\WinSxS\\Manifests\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifestC:\\foo並將其重命名為Microsoft.VC80.CRT.manifest

清單文件的第四行看起來像這樣:

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

當我這次嘗試運行C:\\ foo \\ foo.exe時,它無效。 我再次使用C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700和相應的清單文件重復此操作。 它沒有幫助。 我得到了同樣的錯誤。

在這兩種情況下,我在事件查看器>系統中收到以下錯誤。

事件ID:34; 資料來源:SideBySide

Component identity found in manifest does not match the identity of the component requested

事件ID:58; 資料來源:SideBySide

Syntax error in manifest or policy file "C:\foo\Microsoft.VC80.CRT.MANIFEST" on line 4.

事件ID:59; 資料來源:SideBySide

Generate Activation Context failed for C:\foo\Foo.exe. Reference error message: The manifest file contains one or more syntax errors.

從Windows XP機器(我構建EXE)復制CRT DLL和清單並沒有解決它。

  1. 我將Windows XP機器(我開發並構建了foo.exe)的C:\\winnt\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700msvcm80.dllmsvcp80.dllmsvcr80.dll復制到C:\\foo Windows Server 2003的C:\\foo (我試圖運行foo.exe)。
  2. 接下來,我將C:\\winnt\\winsxs\\Manifests\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifestC:\\foo並將其重命名為Microsoft.VC80.CRT.manifest

清單文件的第四行看起來像這樣:

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

在嘗試運行C:\\ foo \\ foo.exe時,我遇到了上一節中提到的相同錯誤。

從Visual Studio文件夾復制CRT DLL和清單修復它。

  1. 從Windows XP機器的C:\\Program Files\\Microsoft Visual Studio 8\\VC\\redist\\x86\\Microsoft.VC80.CRT復制msvcm80.dllmsvcp80.dllmsvcr80.dllMicrosoft.VC80.CRT.manifest (我在哪里開發並構建了foo.exe)到Windows Server 2003機器的C:\\foo (我試圖運行它)。

清單文件的第四行看起來像這樣:

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

這次我可以運行C:\\ foo \\ foo.exe而沒有任何問題。

我期待安裝第二種方法中描述的'Microsoft Visual C ++ 2005 SP1 Redistributable'(vcredist_x86.exe)可以解決它。 但事實並非如此。 從開發計算機的C:\\Program Files\\Microsoft Visual Studio 8\\VC\\redist\\x86\\Microsoft.VC80.CRT文件夾中復制DLL和清單文件修復了它。 為什么會這樣?

構建選項

如果它,它可以幫助您回答我的問題。 這是我從Visual Studio項目屬性中選擇的編譯器和鏈接器選項:

配置屬性> C / C ++>命令行:

/O2 /GL /D "_MBCS" /FD /EHsc /MD /Fo"Release\\\\" /Fd"Release\\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

配置屬性>鏈接器>命令行:

/OUT:"C:\\MixedBag\\Release\\Foo.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Release\\Foo.exe.intermediate.manifest" /DEBUG /PDB:"c:\\MixedBag\\release\\Foo.pdb" /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

我會回答我自己的問題。 Hans Passant和Luke對這個問題的評論有所幫助。

我下載了Microsoft Visual C ++ 2005 Service Pack 1 Redistributable Package MFC安全更新並將其安裝在我嘗試運行C:\\foo\\foo.exe 此后EXE運行良好。

安裝程序將CRT DLL放在C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262b86 所以,是的,8.0.50727.6195是我正在尋找的CRT DLL的版本,正如Hans Passant正確地說的那樣。

計算此版本的最簡單方法是在開發系統上構建項目時查看Visual Studio生成的清單文件。 我的位於C:\\Foo\\Release\\Foo.exe.intermediate.manifest 它有這樣的標簽:

<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.6195'
                  processorArchitecture='x86'
                  publicKeyToken='1fc8b3b9a1e18e3b' />

所以,這是一個線索,我需要8.0.50727.6195版本的DLL。 剩下的就是搜索正確的vcredist_x86.exe,它恰好出現在我在第二段中提到的URL中。 該URL中的頁面包含指向KB2538242的鏈接,該鏈接顯示安裝程序將安裝的DLL的版本號。

注意:正如Elie在對此問題的不同答案中提到的,由於這是一個32位應用程序,因此必須在應該運行此應用程序的系統上安裝vcredist_x86.exe(而不是vcredist_x64.exe),而不管該系統是32位Windows系統還是64位Windows系統。 同樣,.manifest文件在processorArchitecture屬性中提供了這個線索。

您必須安裝“Microsoft Visual C ++ 2005 Service Pack 1可再發行組件包MFC安全更新 ”,其中包括: http//www.microsoft.com/en-us/download/details.aspx?id = 26347

以下是解決此問題的方法:

你仍然得到的sidebyside錯誤如果正在使用的應用程序是32位,並嘗試在其上安裝了一個VC_REDISTx64 64位操作系統上運行它。

簡單的解決方案,您還必須在64位操作系統上加載VC_REDISTx86

我有一個相關的問題。 安裝了VS2005的兩台開發XP機器,稱它們為A和B.我開發,構建並運行A.然后我將整個項目復制到B.在那里。 試圖運行並得到SusamPal提到的相同錯誤消息。 我意識到在B的WinSxS上有x86_Microsoft.VC80.CRT_xxx清單(和文件夾),但沒有相應的x86_Microsoft.VC80.DebugCRT_xxx清單(以及為什么?!)。 我嘗試了SusamPal描述的幾個舞蹈和咒語無濟於事。 我通過將適當的文件夾從A的WinSxS復制到B以及WinSxs \\ Manifests中的相應清單來解決了這個問題。

雖然我的申請是

在Win 2K8 R2 x64的使用VS2008 開發 (其中有msvcm90.dll,msvcp90.dll和MSVCR90.DLL在C:\\ Program Files文件(x86)的\\微軟的Visual Studio 9.0 \\ VC \\ REDIST \\ AMD64 \\ Microsoft.VC90.CRT)

在Win 2K3 SP2 64位,

但是需要msvcm80.dll,msvcp80.dll和msvcr80.dll。

安裝Microsoft Visual C ++ 2005 SP1可再發行組件包(x86)后 ,可以正確安裝和運行該應用程序。

對我來說,並排錯誤只是通過設置c / c ++ - > CodeGeneration-> RuntimeLibrary,使其成為MTD即多線程調試

我們在這里確實存在以下問題:應用程序可執行文件使用清單機制引用dll。 在過去的應用程序中,作者只需將所需的dll復制到系統目錄中。 不幸的是,當通過不兼容的新版本覆蓋舊的DLL版本時,這會導致所謂的“dll hell”問題,這會導致應用程序停止工作。 然后,MS想出了版本化的想法(winsxs)。

不幸的是,這是非常復雜的機器,嘗試手動將dll(程序集)安裝到sxs文件夾中絕對不是一個好主意。 安裝所謂的“可再發行軟件包”也不是一個完美的解決方案。

另外,當我們想要調試版本時,這無濟於事。 由於MS禁止分發支持dll的調試版本,“可再發行軟件包”不會安裝它們。 (請注意,程序集ID取決於VS2005的當前subversion,並且與已安裝的支持庫有關。)

通常,VS安裝程序會將所需的程序集添加到系統中,但在一段時間后安裝更新或更新的SDK和工具可能會損壞此正確狀態。

假設我們遇到這種情況 - 我們的調試庫不再集成到系統中。 假設我們已經為項目A和活動調試配置提供了工作空間,而不是工作應用程序。 然后我們可以在當前工作空間中創建安裝程序項目,比如說C,添加我們的應用程序(或嚴格地說,使用活動配置的項目)。 安裝程序安裝程序項目將我們的可執行文件放在某個地方(桌面是關於這種情況的正確位置)啟用依賴項檢查和一些其他次要屬性。 然后構建項目C並運行安裝程序(或使用上下文菜單從VS“安裝”)。 現在您的應用程序和使用debug dll庫創建的其他應用程序開始工作。

當你使用“刪除”選項運行安裝程序時要小心,你來到了以前的情況。 這是與分發主題相關的好文章: http//blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redistribute-the-visual-c-libraries-with-your-application .aspx

如果您有其他一些應用程序,並希望僅通過復制來部署它們,可能在沒有安裝VS的非開發機器上,您可以創建虛擬項目以及適當的配置和安裝程序。 然后在每台計算機上安裝一次,然后復制您正在處理的可執行文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM