问题标签 [sxs]

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 投票
8 回答
9469 浏览

windows - 在 Windows 上构建和部署 dll:SxS、清单和所有爵士乐

自 VS 2005 以来,我发现不可能简单地针对 MS 运行时构建一个 dll 并将它们部署在一起(http://www.ddj.com/windows/184406482)。我对 manifest、SxS 和 co 深感困惑:MSDN 文档真的很差,带有循环引用;特别是因为我更像是一个 Unix 人,我发现所有这些都没有信息。我的核心问题是将 dll 与 msvc9 或 msvc8 链接:由于这些运行时不可再分发,链接和部署此类 dll 的步骤是什么?特别是,清单是如何生成的(我不想要 mt.exe,我想要一些可以跨编译器移植的东西),它们是如何嵌入和使用的?并排组装是什么意思?

基本上,我在哪里可以找到任何类型的规范而不是 MS 行话?

感谢所有回答的人,这真的很有帮助,

0 投票
6 回答
3051 浏览

c++ - 添加 Boost 使 Debug 构建依赖于“非 D”MSVC 运行时 DLL

我有一个烦人的问题,我可能能够以某种方式规避它,但另一方面,我宁愿在它之上并了解到底发生了什么,因为看起来这些东西真的会留下来。

故事是这样的:我有一个简单的 OpenGL 应用程序,它运行良好:在编译、链接或运行它时从来没有出现过大问题。现在我决定尝试将一些更密集的计算转移到工作线程中,以便可能使 GUI 响应更快——当然是使用 Boost.Thread。

简而言之,如果我在 .cpp 文件的开头添加以下片段:

,然后我在尝试启动调试版本时开始收到“此应用程序无法启动,因为未找到 MSVCP90.dll”。(发布模式工作正常。)

现在查看使用 Dependency Walker 的可执行文件,他也没有找到这个 DLL(我猜这是预期的),我可以看到我们正在寻找它以便能够调用以下函数:

接下来,我尝试转换每个实例minmax改为使用宏,但可能找不到对它们的所有引用,因为这没有帮助。(我正在使用一些我没有可用源代码的外部库。但即使我能做到这一点——我认为这真的不是正确的方法。)

所以,我的问题——我猜——是:

  1. 即使使用调试版本,为什么我们还要寻找非调试 DLL?
  2. 解决问题的正确方法是什么?或者甚至是一个快速而肮脏的?

我首先在 Visual Studio 2008 的普通安装中安装了这个。然后尝试安装 Feature Pack 和 SP1,但它们也没有帮助。当然也尝试过多次Rebuild。

我正在为 Boost (v1.36.0) 使用预构建的二进制文件。这不是我第一次在这个项目中使用 Boost,但它可能是我第一次使用基于单独源的部件。

禁用增量链接没有帮助。该程序是 OpenGL 的事实似乎也不相关——当我将相同的三行代码添加到一个简单的控制台程序中时,我遇到了类似的问题(但它抱怨 MSVCR90.dll 和_mkdir,当我替换后者boost::create_directory,问题消失了!!)。它实际上只是分别删除或添加使程序运行正常或根本不运行的那三行。

我不能说我理解并排(甚至不知道这是否相关,但这是我现在的假设),老实说,我也不是很感兴趣——只要我能构建、调试和部署我的应用程序...


编辑 1:在尝试构建一个能够重现问题的精简示例时,我发现该问题与Spread Toolkit有关,它的使用是我所有遇到此问题的程序的共同因素。(但是,在开始链接 Boost 内容之前,我从未有过这个。)

我现在想出了一个最小的程序,可以让我重现这个问题。它由两个编译单元A.cpp和B.cpp组成。

A.cpp:

B.cpp:

一些观察:

  1. 如果我注释掉SP_joinA.cpp 行,问题就消失了。
  2. 如果我注释掉 B.cpp 的单行,问题就消失了。
  3. 如果我将 B.cpp 的单行移动或复制到 A.cpp 的开头或结尾,问题就会消失。

(场景2和3,调用时程序崩溃SP_join,但那只是因为邮箱无效......这与手头的问题无关。)

此外,Spread 的核心库已链接,这肯定是我的问题 #1 答案的一部分,因为我的系统中没有该库的调试版本。

目前,我正在尝试提出一些可以在另一个环境中重现该问题的方法。(尽管如果它真的可以在我的场所之外重复,我会感到非常惊讶......)


编辑 2:好的,所以现在我们有一个包,我可以使用它在 WinXP32 + VS2008 + Boost 1.36.0 的几乎普通安装上重现该问题(仍然是来自 BoostPro Computing 的预构建二进制文件)。

罪魁祸首肯定是 Spread 库,我的构建不知何故需要一个用于MSVC 6的相当古老的 STLPort 版本!尽管如此,我仍然觉得这些症状比较有趣。此外,很高兴听到您是否可以真正重现该问题 - 包括上面的场景 1-3。包装很小,应该包含所有必要的部件。

事实证明,这个问题与 Boost.Thread 没有任何关系,因为这个例子现在使用了 Boost Filesystem 库。此外,它现在抱怨 MSVCR90.dll,而不是以前的 P。

0 投票
1 回答
1329 浏览

installation - SxS 安装和 WiX

我试图弄清楚如何处理我们作为框架的项目的安装和部署。通常,开发人员会安装框架,然后让他们的 .Net 应用程序引用我们的 dll。

该框架有2个层次:

  1. 许多本机 C++ dll
  2. 一些引用本机 dll 的 C++\CLI 和 C# 程序集(都是 dll)

我想提供一个安装程序,将 .Net 程序集放在 GAC 中,并将本机程序集安装在 WinSxS 文件夹中。到目前为止,我还没有找到很多关于安装 SxS 程序集的信息。我知道它可以使用 MSI 来完成,我想知道是否有人知道如何使用 WiX 或其他一些安装工具来完成。

我相信这不能使用 Visual Studio 安装项目来完成。

0 投票
3 回答
548 浏览

winapi - Pktextract.exe 安装在哪里?

我安装了 Visual Studio 2008 和适用于 Windows Server 2008 和 .NET Framework 3.5 的 Windows SDK。我相信那是最新的平台SDK。

我正在尝试构建一个签名的 dll 以安装在 SxS 中。所有教程都解释了使用名为 pktextract.exe 的工具,它是 SDK 的一部分,但我似乎找不到该工具。所有其他工具,如 makecert、mt、makecat 都存在。

pktextract 是否被最新版本的 sdk 中的其他工具取代?

谢谢您的帮助。

0 投票
1 回答
1017 浏览

sxs - 如何为本地 SxS dll 编写策略重定向文件?

我在哪里可以找到一个很好的参考资料来解释如何编写和安装从一个本机程序集版本重定向到另一个的 SxS 策略?

我已经使用 wix 安装程序成功构建和安装了两个版本的本机程序集。但我不确定如何从这里开始。我发现的大部分信息都是关于托管程序集和 GAC 的。我正在寻找的过程与托管 dll 的过程是否相同?

谢谢你的帮助,丹

0 投票
3 回答
1058 浏览

.net - 构建时如何在 .NET 依赖链上要求 x86

我们有几个项目使用p4.net,一个托管 DLL,它又依赖于 p4dn.dll,一个 32 位非托管 DLL。这在 x64 系统上存在问题,所以我不得不去每个使用 p4.net 的项目并将其处理器类型设置为 x86。

如果我理解正确的问题,那就是当 .NET 加载一个 exe 时,它​​会检查清单,如果没有,它会做最适合处理器类型的任何事情。然后,当它运行到 32 位 dll 时,它会呕吐。

我可以去每个使用 p4.net 的项目并将其标记为 32 位。但是我们有很多这样的。此外,人们将继续制作新的并忘记设置 32 位,然后当其他人尝试在 x64 上使用它时,我们将再次遇到此问题。

我的问题是:有没有办法让 .NET 自动加载任何使用 p4dn.dll 作为 32 位的应用程序?如果做不到这一点,IDE 有没有办法检测到这一点并且无法构建?

或者是否可以制作一个我可以放在 p4api 或 p4dn.dll 旁边的 .manifest 文件,以便使用它们的任何应用程序将自动以 32 位运行?

0 投票
3 回答
3991 浏览

.net - 有没有人成功地将免注册 COM 与 .NET 组件一起使用?

直到最近,我们还在为我们的本机和 .NET COM 组件愉快地使用免注册COM。但是,我们遇到了一个奇怪的问题,我们的应用程序在 Windows XP SP3 上开始随机崩溃(但不是在 vista 上),因为我们只更改了 .NET 程序集的版本号以从候选发布版移动到发布版。(你不只是讨厌墨菲定律吗?)

经过许多人日和磨牙,我们发现这个问题是sxs.dll中的一个已知错误,它在检索有关 .NET 类的信息时会导致堆损坏。有一个热修复程序可以使问题消失,但热修复程序并不打算重新分发。

我们有点难过,免注册的 COM 实现中存在如此可怕的错误。有没有人成功地为 .NET 组件使用免注册 COM?你是如何解决这个问题的?

0 投票
2 回答
2259 浏览

windows - 每个应用程序配置文件 bindingRedirect 不适用于 Dll

我创建了一个简单的 Win32 应用程序,通过包含对版本 6 commctl32.dll 的清单依赖项来演示 XP 上的 UXtheme 然后我创建了一个简单的 Win32 dll,使用 构建它ISOLATION_AWARE_ENABLED,并使用指定 Comctl32 版本 5 和 6 的嵌入式清单对其进行测试.dll

我使用这种方法成功地让 exe 和 dll 使用不同版本的 comctl32.dll。使用 5 的 exe 和 6 版的 dll,反之亦然。

然后,我将应用程序和 dll 重置为具有 comctl ver 5 清单依赖项。并引入了一个应用配置文件:

现在,当我运行我的应用程序时,应用程序显然被重定向到 commctl v6 - 使用启用的 XP UXTheme 清楚地显示对话框。但是,该 dll 没有被重定向,而是使用 commctl 的非主题版本 5。

文档中没有提到用于执行 bindingRedirects 的 per-dll 配置文件。并且尝试创建一个不会做任何事情。

我也知道从一个主要版本的程序集到另一个版本的绑定重定向不是受支持的场景,但我真的只是使用 commctl32 作为测试机制的一种明显简单的方法。

如何重定向 dll 的依赖程序集的版本?

0 投票
4 回答
2042 浏览

.net - 免注册 COM 互操作和相关程序集

我们正在将基于 MFC 的大型应用程序与少数托管 (.NET) 加载项集成在一起。与这些插件的通信是通过 COM 完成的。

从历史上看,我们只是使用注册表来使这些加载项(作为 COM 服务器)对应用程序可用。但是,现在我们正在尝试使用免注册 COM 互操作来执行此操作。

我们希望这些加载项能够与应用程序运行所在的目录分开存放在一个单独的目录中——最好是在任何地方。但是,由于无法解析依赖程序集,我们显然遇到了服务器对象的实例化问题,这些程序集也存在于 COM 服务器 DLL 的目录中。

“老式”COM 互操作通过在加载目标程序集时使用 LoadFrom 上下文来处理此问题。但是激活上下文机制似乎并没有做到这一点。

有谁知道如何让它工作?尚不清楚我们是否可以在模块的 SxS 清单中识别依赖程序集,或者我们是否可以以不同的方式创建激活上下文?

感谢您的任何想法/提示!

杰夫

0 投票
1 回答
1137 浏览

qt - 运行 Qt Creator 时出现并排错误

在 Vista Ultimate(无 SP)上,我使用 Windows 二进制安装程序安装了诺基亚的 Qt Creator 1.3。当我尝试运行它时,我收到一个并排错误消息:“应用程序无法启动,因为它的并排配置不正确。请参阅应用程序事件日志以获取更多详细信息。”

事件查看器日志显示:“C:\Qt\qtcreator-1.3.0\bin\qtcreator.exe 的激活上下文生成失败。依赖程序集 Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b" ,type="win32",version="9.0.21022.8" 找不到,详细诊断请使用sxstrace.exe。

运行和 sxstrace 给了我一个日志文件。我已经在http://cl1p.net/sxstrace/上传了内容

我认为它与不同版本的 DLL 和 Sxstrace 系统以及 VC90.crt 有关,但我不知道该怎么做。如果有帮助,我在 PC 上安装的唯一其他开发工具是 Dev-C++(和 MingW)。我过去曾安装过 Visual Studio,但从那以后它就被卸载了。其他具有 VC90.crt 清单的应用程序,如 Limewire 和 Digsby 运行良好。请帮忙?