2009-08-26 80 views
2

我發現即使使用SxS進行動態鏈接,Windows Update也會出現並踩到VC8 CRT的某個版本(例如它存在安全漏洞),然後我的應用將無法使用舊版本運行。有什麼原因不能靜態鏈接到VC CRT?

除了增加二進制文件的大小外,還有哪些重要原因可以保持與VC CRT的動態鏈接?

+0

你是說,你的程序加載(或嘗試)與安全修補程序更新的CRT,但它不工作,由於與更新的CRT incompatiblities? – 2009-08-27 00:08:03

回答

4
  1. 保持最新的安全修復程序是一個很好的理由。否則,您需要負責使用固定CRT重建您的應用程序並將其部署到您的客戶。
    • 使用共享CRT應該會導致系統的內存佔用量更低,因爲大多數DLL的頁面可以在進程之間共享。
+0

3.如果您的應用程序有多個DLL文件,你就可以在由另一個DLL malloc分配一個DLL釋放內存,因爲他們會全部共享的運行時一個實例和一個堆。如果您嘗試使用與靜態CRT鏈接的每個模塊(或某些模塊),則會出現與堆相關的錯誤。 – 2009-08-27 22:38:28

0

當您的程序正在使用來自您提到的「安全漏洞」之一的CRT中的某些內容時。如果您靜態鏈接,您的用戶將不知道他們受到安全漏洞的威脅,並且可能存在病毒危險。另一方面,如果你的程序因爲動態鏈接而不工作,它們將被迫更新爲新的安全版本。

+0

我看到的問題是我有一個應用程序被構建,以便它動態鏈接到CRT的新版本。當我將它部署到具有較舊版本的另一臺計算機上時,它將不會運行,因爲依賴關係在較新版本上。 微軟已經更新了CRT,但現在看來,這不是在再發行組件包可用,但作爲一個安全更新的一部分。因此,如果客戶或用戶拒絕運行補丁程序,他們將無法運行應用程序,因爲他們無法獲取安裝在機器上的新CRT。我在這裏錯過了什麼? – 2009-08-27 11:19:07

0

你在Windows中很幸運。而Linux的字面意思是由庫的組成,並且你們都有這些問題。 :-)

據我所知,庫供應商總是保持向後兼容性,特別是如果它是微軟。因此,可能的解決方案是在舊機器上構建應用程序,同時牢記微軟開發CRT庫的方式可以讓您的應用程序在所有更高版本上運行。

2

我更喜歡靜態鏈接。安全並不是一個真正的大問題,因爲黑客瞄準了許多用戶在他們的系統上安裝的應用程序。所以除非你的應用程序擁有超過100萬用戶,否則我不會擔心它被黑客利用。

我不喜歡動態鏈接。它對我來說太脆弱了。

編輯:如果你想確保你的用戶有你的應用程序的最新版本,那麼也寫一個更新應用程序,隨着你的主應用程序自動安裝。在Windows上,這可以作爲服務來實現。

1

如果完成正確的應該有絕對沒有動態鏈接的問題,應用程序不應該失敗運行。唯一困難的部分是切換到從現在使用的任何方法構建安裝程序到Microsoft支持的方式(可重新分發的合併模塊 - MSM,MSI,動態鏈接)。請參閱this link從源頭獲得非常寶貴的建議。從博客的有趣引言:

  • 爲了重新分配的Visual C++庫,你需要做的是包括適當的.msm文件和與之配套的政策的.msm分發您所需要的庫中的所有
  • 再次,只是強調 - 除非你使用點擊一次部署應用程序不使用VCRedist * .EXE
  • 不過,我能想到的沒有場景在此(我注:靜態鏈接)實際上是運送你的產品給客戶的時候做正確的事情。

我不同意,你可能需要做不平凡的工作,以實現這個(也許您不使用MSI現在等),但我認爲,如果條件允許,你應該嘗試切換到上述推薦的方法。

如果你不這樣做,你的應用程序將停止的確在某些時候工作上面描述的方式。開發人員指責微軟,但他們並沒有遵循上述支持的方式。也許微軟應該責怪它,因爲它並沒有鏈接到MSDN上更多的博客上來傳播這個詞,但這就是它。

相關問題