簡體   English   中英

為什么我的電腦上有同一個 C++.dll 的多個副本?

[英]Why are there multiple copies of the same C++ .dll's on my computer?

我注意到 Microsoft Visual C++ 運行時庫在我的計算機上重復,例如:在以下位置:

C:\Windows\System32
C:\Windows\SysWOW64
C:\Program Files\Common Files\microsoft shared
C:\Program Files (x86)\Mozilla Firefox
C:\Windows\WinSxS\amd64_microsoft-windows-u..lcrt-apifwd-winblue_31bf3856ad364e35_6.3.9600.18036_none_b157f27efd203c73
C:\Windows\WinSxS\x86_microsoft-windows-u..lcrt-apifwd-winblue_31bf3856ad364e35_6.3.9600.18036_none_553956fb44c2cb3d

在此處輸入圖像描述

為什么是這樣? 我以為一個特定的.dll 只能用 windows 注冊一次? 不是這樣嗎? 您真的可以從多個位置注冊相同的.dll 嗎?

我卸載了舊版本的 Skype,它在自己的文件夾中包含 C++.dll。 但是這樣做會導致大量其他程序崩潰(例如 Adobe Acrobat 等)。 我通過修復可從控制面板的程序和功能 window 再分發的 C++ 2015 來修復它。 但是在檢查損壞的文件是否被重新創建和重新注冊時,我發現了很多版本。 我怎么知道哪個注冊了 Windows?

如果我想編寫引用那些.dll 的代碼,它會使用哪一個?

我在這篇文章中找到了一些原因。

考慮這種情況:您安裝程序“A”,它使用庫版本 1。然后您安裝程序“B”,它也使用庫版本 1,所以它不需要安裝它 - 它可以使用已經存在的副本由程序“A”提供。 現在您卸載程序“A”。 可能會發生三件事:

  • 它卸載了庫,因為它安裝了它,它應該自行清理,沒有意識到另一個程序依賴於該庫。 程序“B”因此中斷。
  • 它永遠不會卸載該庫,因為另一個程序可能正在使用它。 結果,圖書館登記入住,但他們從未離開。
  • 我們 devise 一些方法跟蹤有多少已安裝的程序正在使用該庫,並且僅在卸載最后一個時才將其刪除。 不幸的是,任何單個程序的故障——無論是編程錯誤還是未能正確安裝或卸載——都會破壞這種技術。 最好的情況是,您只剩下不再需要的庫副本,最壞的情況是,卸載一個程序可能會導致一個或多個其他不相關的程序失敗。

一團糟。 事實上,它是如此的混亂,以至於現在大多數程序都懶得去嘗試和分享。

把你的命運交到別人手中:

最終,應用程序供應商意識到,通過依賴這樣的共享庫,他們將自己的命運掌握在碰巧使用同一庫的相同版本的所有其他應用程序手中。 如果只有其中一個人犯了錯誤,並且庫在不應該發生的情況下被意外刪除或更新,那么所有其他人都處於危險之中。

因此,應用程序供應商現在通常會安裝他們自己管理且可以依賴的庫副本。 磁盤空間很便宜——比他們嘗試共享時發生的錯誤和挫折要便宜得多。

所以現在,在我的機器上,許多不同的應用程序都帶有自己的 Microsoft Visual C++ 運行時副本。

由於掌握了自己的命運,因此每個人都更加穩定。

然而,目前尚不清楚 dll 文件如何以相同的名稱但從不同的位置注冊。 我不認為這是可能的,但也許是。

暫無
暫無

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

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