Visual c++ 为什么同一个C++。dll';我的电脑上有什么? 我注意到微软Visual C++运行库在我的计算机上都是重复的(例如:在以下位置:)

Visual c++ 为什么同一个C++。dll';我的电脑上有什么? 我注意到微软Visual C++运行库在我的计算机上都是重复的(例如:在以下位置:),visual-c++,dll,redistributable,vcredist,Visual C++,Dll,Redistributable,Vcredist,C:\Windows\System32 C:\Windows\SysWOW64 C:\Program Files\Common Files\microsoft shared C:\ProgramFiles(x86)\Mozilla Firefox C:\Windows\WinSxS\amd64\u microsoft-Windows-u..lcrt-apifwd-winblue\u 31bf3856ad364e35\u 6.3.9600.18036\u none\u b157f27efd203c

C:\Windows\System32
C:\Windows\SysWOW64
C:\Program Files\Common Files\microsoft shared
C:\ProgramFiles(x86)\Mozilla Firefox
C:\Windows\WinSxS\amd64\u microsoft-Windows-u..lcrt-apifwd-winblue\u 31bf3856ad364e35\u 6.3.9600.18036\u none\u b157f27efd203c73
C:\Windows\WinSxS\x86_microsoft-Windows-u..lcrt-apifwd-winblue_31bf3856ad364e35_6.3.9600.18036_none_553956fb44c2cb3d

为什么会这样?我以为一个特定的.dll只能在windows上注册一次?不是这样吗?您真的可以从多个位置注册相同的.dll吗

<>我卸载了一个旧版本的Skype,它在自己的文件夹中有C++ .dll。但这样做会导致大量其他程序崩溃(如AdobeAcrobat等)。我通过修复C++ 2015从控制面板的程序和特性窗口重新分配来修复它。但在检查受损文件是否被重新创建和注册时,我发现了这么多版本。我如何知道哪一个是在Windows上注册的


如果我想编写引用这些.dll的代码,它会使用哪一个?

我在文章中找到了这方面的原因

考虑这个场景:您安装程序“A”,它使用库 第1版。然后安装程序“B”,它还使用库 版本1,所以它不需要安装它-它可以只使用副本 这已经是节目“A”的礼节了。现在你可以卸载了 节目“A”。可能发生三件事:

  • 它卸载库,因为它安装了库,并且应该清理 在它自己之后,没有意识到另一个程序依赖于库。程序“B”因此中断
  • 它从不卸载库,因为其他程序可能正在使用它。结果,图书馆登记入住,但从未离开
  • 我们设计了一些方法来跟踪有多少已安装的程序正在使用该库,并且只在最后一个程序被卸载时才将其删除。不幸的是,任何一个程序的失败——无论是编程错误还是未能正确安装或卸载——都会破坏这种技术。在最好的情况下,您只剩下不再需要的库的副本,在最坏的情况下,卸载一个程序可能会导致一个或多个其他不相关的问题 程序可能会失败
一团糟。事实上,这是一片混乱 现在的程序根本不需要尝试和共享

把自己的命运交给别人: 最终,应用程序供应商意识到,通过依赖这样的共享库,他们将自己的命运交给了碰巧使用同一库的同一版本的所有其他应用程序。如果其中只有一个出错,而该库本不该被意外删除或更新,则会使其他所有库都处于危险之中。

因此,应用程序供应商现在通常安装自己的 他们管理的、他们可以信赖的图书馆。磁盘空间不足 便宜——比过去的错误和挫折要便宜得多 当他们试图分享时发生。

现在,在我的机器上,许多不同的应用程序都带有自己的微软Visual C++运行时副本。 因此,由于控制了整个系统,每个系统都更加稳定 他们自己的命运


然而,目前还不清楚如何使用相同的名称注册dll文件,但从不同的位置注册。我不认为这是可能的,但可能是。

本主题已详细介绍。上面列表中唯一“注册”的副本是
C:\Windows\WinSxS
中的副本。其他的只是磁盘上的文件。还要注意的是,在这些目录中找到的并非所有文件都必须相同,即使它们可能具有相同的名称。
System32
SysWOW64
中的模块当然不同,因为前者包含64位模块,而后者包含32位模块。其他应用程序可能依赖于特定版本的运行时,并使用其私有副本(也称为本地部署)。