2010-02-03 37 views
7

我有一個我試圖打包進行部署的MFC應用程序。它似乎取決於文件'msvcr90.dll','msvcp90.dll'和'mfc90.dll'。什麼是分配這些文件的正確方法?分配VC++運行時文件的正確方法

我無法使用合併模塊,因爲我的安裝程序不支持它們。 我知道我可以運行VCRedist_x86.exe,但我不想因爲各種原因這樣做。

據我可以看到我唯一的選擇是安裝文件作爲私人並排組件。它是否正確?

根據http://msdn.microsoft.com/en-us/library/ms235317(VS.80).aspx安裝專用程序集的正確方法是將'Microsoft.VC90.CRT'和'Microsoft.VC90.MFC'文件夾複製到與可執行文件相同的文件夾中。這是解決問題的正確方法嗎?它可以工作,但是似乎有一段時間是以這種方式複製系統文件的。任何人都可以向我展示另一個應用程序(或者至少是一個演示項目)的例子嗎?

最後,我什麼時候需要擔心爲應用程序分發.manifest文件?我應該明確安裝XML文件,還是以某種方式嵌入到我的可執行文件中?

+0

FWIW我問了一個關於發送CRT DLL的類似問題。 http://stackoverflow.com/questions/2131093/distributing-the-visual-c-runtime-libraries-msvcrt – Rob 2010-02-03 14:25:13

+0

歡迎來到DLL地獄,第3章。*(前兩章討論文件位置問題和版本問題。) – 2010-02-03 18:08:53

回答

1

通常我會說你應該在目標機器上安裝所需的可再發行組件,因爲它是「乾淨的方式」。但你也可以做90年代的風格。它強烈地依賴於你用來構建應用程序的CRT/MFC庫。這可以在清單文件中檢查。您還可以強制應用程序與指定的lib綁定。沒有任何定義VS2008通常綁定9.0.21022.8,與

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 

最近的庫被採取。您還可以指定版本綁定:

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

和/或

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

所以,如果你想這樣做,90年代的風格,將文件從C:\Windows\Winsxs\複製並從該文件夾取的DLL你綁在一起,例如如果您將CRT用於x64應用程序,或者對於x86版本的CRT使用等效的x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d,則可以使用amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d4

+1

uhm,#define並不帶一個賦值運算符... – kusma 2010-02-03 16:20:05

1

你也可以考慮靜態鏈接MFC和CRT,那麼你只需要運送你的EXE文件。這雖然有優點和缺點。

+0

這是真的,但[Microsoft不鼓勵靜態鏈接](http://msdn.microsoft.com/zh-cn/library/ms235316.aspx)。 – skst 2013-01-18 19:55:57

1

我會說這足以將這些dll與您的exe一起,因爲當前路徑是他們首先查找的位置。

當然,您應該努力安裝可再發行組件,因爲這是更安全的方式。

+0

使用可重新分配的是[Microsoft當前的建議](http://msdn.microsoft.com/zh-cn/library/ms235316.aspx)。 – skst 2013-01-18 19:57:59

+0

這是正確的答案。 [Microsoft建議](https://msdn.microsoft.com/en-us/library/ms235299.aspx)安裝可再發行組件或將dll安裝在可執行文件旁邊。引用:「要部署可再發行的Visual C++文件,可以使用Visual Studio中包含的Visual C++可再發行組件包或使用可再發行的合併模塊,也可以將可再發行的Visual C++ DLL直接安裝到應用程序本地文件夾中,即文件夾包含可執行應用程序文件「。 – Marc 2015-05-29 19:42:14