问题标签 [winsxs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1080 浏览

windows - Windows 7 和 Windows Server 2008 R2 中不同的 WinSxS 行为

我有一个可执行文件,它的清单说它取决于

在 Windows 7 上,此可执行文件可以正常运行。在 Windows Server 2008 R2 上,此可执行文件无法运行并显示以下消息:

应用程序无法启动,因为它的并排配置不正确。请查看应用程序事件日志或使用命令行 sxstrace.exe 工具了解更多详细信息。

这是出乎意料的——我认为 Windows 7 和 Windows Server 2008 R2 在运行时可用性方面应该非常相似。两台机器都很干净。Windows 7 机器是全新安装的,上面没有任何内容。Windows Server 2008 R2 机器只有一些来自 Windows Update 的更新。

我检查了 Windows 7 机器的 WinSxS 目录,发现

我检查了 Windows Server 2008 R2 机器的 WinSxS 目录,发现

存在的运行时比清单中指定的更新,但 Windows Server 2008 R2 系统无法重定向到更新的运行时。在 Windows Server 2008 R2 上运行 sxstrace 显示:

在 Windows 7 上运行 sxstrace 会给出:

除了安装 VS 2008 运行时和 VS 2008 SP1 运行时之外,有什么想法可以解决这个问题吗?我认为程序集的整个想法是它允许系统覆盖较旧的运行时并替换较新的运行时。

0 投票
1 回答
669 浏览

visual-studio - 确定 MSVC 清单生成器中的依赖源

我正在使用 Microsoft Visual C++ 2005 构建应用程序。在对库进行重大更新后,我的清单文件中出现以下条目:

但是,当我查看在生成的可执行文件上使用 Dependency Walker 时,我根本没有在列表中看到 MSVC80D.DLL,这让我有点惊讶。

我还尝试将链接器设置为“详细”模式,看看它是否会告诉我清单中指示的依赖项来自哪里。唉,那里的信息没有说明问题。

我还浏览了我要链接的所有库,看看它们中是否有任何使用调试 CRT。据我所知,他们都没有。

如何确定导致此问题的库?当我按原样分发可执行文件时,我得到一个并排错误,大概是因为自动生成的清单中的这个条目。

非常感谢您提供的任何帮助......经过几天试图弄清楚发生了什么,我开始对这个问题感到非常沮丧。

0 投票
2 回答
9962 浏览

visual-studio-2010 - Visual C++ 2010:对 MSVC 运行时部署的更改(不再使用带有清单的 SxS)

在哪里可以找到一些官方说明、kb 文章或其他描述 Visual Studio 2010 C/C++ 运行时链接和部署策略更改的文档?

在 Visual Studio 2008(带有 VC90 运行时)下,清单嵌入在本机映像中,运行时库被部署为并行程序集 (WinSxS)。这在使用 VS 2008 SP1 重建本机 exe 或库时会导致问题,因为嵌入式清单需要 C++ 运行时的更新版本。

对于 VS 2010 和 MSVCR100 运行时版本,该策略似乎已经完全改变。

  1. 文件 msvcr100.dll 和其他 C/C++ 运行时库不再作为 SxS 程序集安装。
  2. 在 VS2010 下编译时,不会将运行时“依赖”条目添加到嵌入式清单中,这意味着任何版本的 msvcr100.dll 都可能在运行时加载。
  3. 在安装了 .NET 4 的机器上,匹配的运行时名为 msvcr100_clr0400.dll,并且不会由本机代码加载,尽管重命名为 msvcr100.dll 的副本可以正常工作。我认为这意味着任何带有 C/C++ 代码的进程总是会加载相同 C/C++ 运行时的两个版本。

这似乎是政策上的重大变化,从我们在 VS 2008 下的 SxS 部署和清单依赖项回溯。任何人都可以更清楚地了解发生了什么变化,并可能指向一些文档、描述这些变化的自述文件或博客文章,动机和相关影响?

它认为这样更好——强大的版本清单和 SxS 部署是一场噩梦——但我对 VS 2010 中这些意想不到且看似未记录的变化感到惊讶。

额外问题:如何在 VS 2010 下编译我的 C++/CLI 库以链接到 msvcr100_clr0400.dll 而不是 msvcr100.dll?这个想法是 C++/CLI 程序集应该在没有依赖项的情况下运行,除了 .NET 4 安装的依赖项(没有静态链接)。

0 投票
2 回答
4994 浏览

delphi - 取消选中“启用运行时主题”或删除 Delphi XE 中的内部清单?

我有一个在 Delphi XE 中构建的组件,我想以下列方式使用它:

  1. 用户创建一个新的空白项目。

  2. 用户将我的组件放在表单上。

  3. 我的组件中的一些特殊设计时代码被执行,这将更改项目选项以取消选中项目选项中的“启用运行时主题”复选框。我不确定这是否可能,所以我问是否可能。

如果#3 是不可能的,那么我需要另一个解决方案来解决这个组件的“可用性”问题;我遇到的问题是,如果用户没有通过取消选中启用运行时主题来禁用静态链接的清单文件,那么链接到 EXE 的静态生成的清单似乎会覆盖我希望在 EXE 之外拥有的外部清单文件,在磁盘。我还需要在运行时修改这些清单,因此需要外部清单。当然,我可以在需要时使用这些清单启用运行时主题功能。第二个问题是关于外部和内部清单的优先级;当您选中“启用运行时主题”时,外部清单能否以某种方式优先于链接到 Delphi 应用程序的内部清单资源?

#3 以外的可接受解决方案:

A. 不知何故导致 Delphi 不生成清单。B. 以某种方式在运行时让 Windows 识别并优先考虑外部 .manifest 文件,即使找到内部文件也是如此。

C. 最差解;在运行时,在我的组件中的 CoCreateInstance 失败后,我可以枚举资源,报告存在外部清单并将我们搞砸,并依靠使用我的组件的开发人员阅读我的组件吐出的运行时错误消息,告诉他们禁用运行时主题复选框并重建他们的应用程序。提取和读取清单已在此处的另一个 stackoverflow 问题中进行了介绍,其中 C++ 代码可以轻松转换为 Delphi。

更新接受的答案完全符合我的要求,但被认为是一种黑客行为,而大卫关于激活上下文的答案更加理智,并且是推荐的方法。

Update2通过项目设置明确指定要链接的清单,通常会在更高版本的 Delphi(XE5 及更高版本)中覆盖内置清单。

0 投票
1 回答
2717 浏览

windows - 如何从 SxS 缓存中删除已卸载的 DLL

我有 VS 2008。我升级到 VS 2010,并卸载了 VS 2008。

我有一个在我的机器上运行的测试,但无法在构建实验室的机器上加载。经过一些调试,我意识到测试可执行文件仍然依赖于 msvcr90d.dll(这是一个 VC++ 2008 调试运行时库)。即使我已经卸载了 VS 2008,测试仍然可以在我的机器上运行,因为该运行时 DLL 仍然存在于并行缓存 (%windir%/winsxs) 中。构建实验室机器没有 DLL,所以它不会在那里加载。

卸载 VS 2008 不应该导致其所有运行时 DLL 从并行缓存中删除吗?

有没有办法可以从并行缓存中手动删除这些旧的 DLL?我希望能够轻松检测到我可能仍然具有过时依赖项的其他地方。

0 投票
1 回答
1424 浏览

com - 通过 COM/SxS 在 Unity3d 中使用 .NET 4.0 DLL?

为了简化我的问题,我会尽量简短:

我正在使用 Unity 的专业版,并且我有 2 个 DLL:

  1. .NET 3.5 程序集(充当 COM 客户端)
  2. .NET 4.0 程序集(具有通过 COM 公开的接口)

3.5 使用 COM 与 4.0 一起工作。在 Windows 应用程序中使用 3.5 程序集可以正常工作,它通过 Type.GetTypeFromCLSID() 或 Type.GetTypeFromProgID() 使用 SxS 加载 4.0 dll(我已经通过 SxStrace 确认),并且可以很好地使用它的功能。(Windows 应用程序通过清单提到它依赖于 4.0 DLL,我没有注册 COM DLL。)

我正在尝试在 Unity 中使用 .NET 4.0 DLL。显然我不能直接使用它,因为目前 Unity 使用的 Mono 版本最多只支持 3.5,因此我创建了 3.5 程序集作为我的中间人。我可以很好地统一使用 3.5 程序集,但是我之前提到的任何一种 Type 方法都会抛出 NotImplementedException(s),因为显然 Unity(或者更确切地说,Mono)不支持它们,所以我在失利。

有任何想法吗?

0 投票
2 回答
7281 浏览

windows - 用本地配置文件替换 Microsoft.VC90.CRT WinSxS 策略文件

在 Windows XP 上,我有一个 .exe,它与msvcp90.dllmsvcr90.dllMicrosoft.VC90.CRT.manifest在我的本地应用程序目录中运行。我还有一个用于这些 .dll 的策略文件C:\WINDOWS\WinSxS\Policies,它是由Visual C++ 2008 SP1 Redistributable Package安装的。我想删除此策略文件并改用本地目录中的应用程序配置文件。策略文件是:

我的配置文件是:

Dependency Walker 在使用配置文件而不是策略文件时报告并排错误 - 出了什么问题?另外,配置文件应该命名<application>.exe.config,还是Microsoft.VC90.CRT.config

(澄清一下,使用策略文件时没有出现错误。但是,这里的客户端不允许安装可再发行包。

MSDN 文档指出,应用程序配置文件可以重定向应用程序以使用同一程序集的不同版本(每个应用程序配置),并且如果需要,它可以覆盖现有策略(发布者配置)文件。所以我认为必须可以使用本地应用程序配置文件,并且上面文件中的某些内容丢失或不正确。)

0 投票
1 回答
346 浏览

visual-c++ - 在 VC++ 中使用未注册的 tlb 文件

我想使用未注册的 tlb 文件。我发现可以使用 WinSxS 来完成。

现在我的问题是如何从 tlb 文件创建清单文件。Mt.exe 实用程序需要在使用 tlb 选项时指定 dll 选项。

谁能帮帮我

0 投票
3 回答
8687 浏览

visual-c++ - 启动依赖第三方dll的程序时程序初始化失败(0xc0150002)

当我编写一个 c++ 程序(如 B3DTest.exe)时,依赖于第三方 dll(如 B3DViews.dll)(供应商是小公司)。我写的程序很简单,只测试dll中的一个函数。当我启动我的程序时(所需的头文件、.lib 文件和 .dll 文件已链接)。我遇到了下面的问题。

我发现程序在进入我的主要功能之前就退出了。vs2008 IDE的输出是

我将程序和 dll 放在另一台目标计算机中,它工作正常。所以我认为这一定是我的电脑出了问题。我搜索了事件日志,它在下面显示了三个事件

我在 Internet 上搜索,发现有人通过安装解决了类似的问题,Microsoft Visual C++ 2005 Redistributable PackageMicrosoft Visual C++ 2005 SP1 Redistributable Package (x86).
下载了这两个文件并安装了它。但是,它无法工作!互联网上的另一个解决方案是将Microsoft.VC80.CRT文件夹中的文件包含3个dll和Microsoft.VC80.MFC文件夹(也包含4个dll),最后将相应的清单文件放在B3DTest.exe的目录中(我的程序) . 但是,它仍然没有工作!但是有些东西改变了event log只有 1的地方event error,下面说:

有人告诉我,可能是我电脑中的VC80.CRT和VC80.MFC的版本不匹配B3DViews.dll(由供应商分发)中的版本号。然后我B3DViews.dll用 emacs.exe 打开并搜索附加到 dll 的清单。它在下面说:

版本号让我很困惑。怎么可能,8.0.50727.61958.0.50608.0认为它应该是一个版本号(不是上面显示的两个)。我找到了 Microsoft.VC80.CRT dll 和 Microsoft.VC80.MFC dll 以及相应的清单文件(所有版本号都在 C:\Windows\WinSxS 中并将其放在与(我的程序)8.0.50727.6195相同的目录中B3DTest.exe.它也不起作用.为了找出问题.我用Dependency Walker for Win32 (x86)来分析我的程序 ie B3DTest.exe.它说如下:

它让我疯狂。我不想弄清楚。任何帮助将不胜感激!
这(http://www.codeguru.com/forum/showthread.php?t=408061)可能有助于解决问题。但我无法通过阅读来弄清楚。我的系统是windows xp sp3,我用的是VS2008。我没有安装VS2005。

0 投票
1 回答
15145 浏览

c++ - WinSxS 无法加载 VC++ DLL

我遇到了几个 VC++ DLL 的问题,我应该将它们包含在我的 .NET/C# 项目中。一个 VC++ DLL 是一个 C++/CLI DLL,我将其用作 .NET 项目的公共接口。其他 DLL 是用本机 C++ 编写的。我无法访问 VC++ DLL 的源代码,我只能使用它们。

我制作了一个 .NET 测试项目并引用了 C++/CLI DLL。没问题,编译器很幸运,很棒。只有一个问题:当我启动 .NET 程序的 EXE 时,由于缺少 VC++ 核心 DLL,我收到有关 C++ DLL 的错误。sxstrace 显示以下内容(缩短):

现在我不是傻瓜,尝试了几件事。我已经阅读了很多关于 WinSxS 的内容,以便更深入地了解正在发生的事情。现在我已经到了让我感到奇怪的地步。我要执行程序的系统安装了当前版本 8.0.50727.762 (SP1) 中的 VC++ Redistributable 包。我知道 winxs 中有一个 Microsoft.VC80.CRT 的策略文件,该文件将这个程序集的所有版本重定向到当前版本 8.0.50727.762(这是http://blogs.msdn.com/b/nikolad问题的解决方案/archive/2007/03/29/a-solution-to-two-references-to-different-versions-of-crt-mfc-atl-in-one-application-manifest-file.aspx)。但正如上面的错误所说,这个策略文件似乎不起作用或没有被考虑在内。系统只想找到 8.0.50727.6195 版本的程序集。

现在这是第一个问题:这里有什么问题?在我弄清楚这一点之后,我可以解决最初的问题......