问题标签 [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 回答
1255 浏览

c# - VS2008/C#:如何指定单独的调试和发布清单?

我有一个需要并行部署手动构建清单的 C# .exe。我需要为每个发布和调试版本使用不同的清单。

我在应用程序设置中设置了我的应用程序清单。但是,这似乎与配置无关(我的应用程序设置顶部的配置选择器显示为灰色,其内容为 N/A)。

我发现了一些针对 C++ 项目执行此操作的技巧,但我是 C#。

我在这里遗漏了一些明显的东西吗?我的谷歌技能生锈了吗?我找不到有关如何为 C# 项目解决此问题的信息,也无法弄清楚如何在 Visual Studio 中进行调整。

0 投票
1 回答
1029 浏览

c++ - 我可以修改并排程序集搜索顺序吗?

我有一个 Windows、C++ 软件项目(使用 Visual Studio 2005、SP1 构建),它具有以下(简化的)文件布局:

binutils目录中都有各种可执行文件。这些可执行文件中的每一个都依赖于我们存储在bin中的并行程序集(C++ 运行时 DLL),但出于各种原因,我们将它们隔离到这些单独的文件夹中(例如,utils文件夹中的 exe 是补充工具到我们的主要应用程序,并且不经常运行)。这种文件组织的直接结果是,utils文件夹中的应用程序无法在尚未安装适当的并行程序集的系统上运行(它们失败并显示通常的“系统无法执行指定的程序”错误信息)。

我的问题:有没有办法告诉utils文件夹中的应用程序明确地在..\bin文件夹中查找适当的并排程序集?Microsoft的Assembly Searching Sequence文章没有提到这是否可能。有没有一种聪明的方法可以解决这些应用程序的运行时要求?

我看到的潜在选择:

  1. 将并行程序集的副本放入utils文件夹中。这可以在运行时完成(以防止我们的应用程序安装包膨胀),但看起来有点脏。
  2. 静态链接运行时 DLL。我不想这样做!
  3. 让最终用户安装通常的可再发行包。我也不想这样做。
0 投票
1 回答
649 浏览

azure - Windows azure 虚拟机中的并行配置问题

我正在做一个实验,目的是让可执行程序在 Windows azure 上运行。

首先,我尝试使用具有 Windows azure 角色的远程桌面使其工作(参考http://msdn.microsoft.com/en-us/library/windowsazure/gg443832.aspx),我将我的 exe 复制到远程桌面,并且一些dll,然后我使用“regsvr32.exe”注册这些dll,然后问题来了:“并排配置不正确”。

我知道当它在我自己的计算机上时如何解决这个问题(只需确保正确的依赖项位于“winsxs”目录中),但现在它在使用 Windows azure 角色的远程桌面中,我无权添加正确的依赖项到 winsxs 目录中。所以我来这里寻求帮助,在此先感谢!

PS:我无法更改我的 exe 引用的这些 dll。

0 投票
1 回答
1756 浏览

.net - VS2005+ 中托管 C++ 包装器 DLL 中的并排错误

我有一个带有 .NET 包装器的本机 C++ 库,全部内置于 Visual Studio 2003 和 2005 中。我们最近将 .NET 包装器库移植到 VS2005,但它不起作用。.NET 包装库是混合模式的,具有本地 C++ 和托管扩展类,以及一些本地程序集。在所有情况下都假设一个发布二进制文件。

VS2003 .NET dll 完美运行,没有任何抱怨,但到目前为止我无法使用 VS2005。我在本机库上构建了其他本机应用程序,因此问题似乎受限于链接器设置和围绕 .NET 库的动态链接规则。

.net 库正在使用 C++ 的托管扩展 (/clr:oldSyntax),因此某些选项在属性表中受到限制。

我原来的问题是运行时错误 R6034: An application has made an attempt to load the C runtime library incorrectly。通过在程序集中包含嵌入式清单已解决此问题。异常跟踪如下:

在程序集中嵌入清单后,我收到一个新错误。问题标题中的并排错误来自 Dependency Walker。全文:

据我所知,与 Kernel32.dll 部分相关的延迟加载警告在不同版本的 Windows 中已发生变化,但与我的应用程序无关,尤其是 MPR.DLL、IESHIMS.DLL 和 WER.DLL。这些警告似乎并不重要。

尝试使用小型控制台应用程序加载 .NET dll 会产生System.IO.FileLoadException

此错误发生在开发机器以及其他机器上,因此我不希望 Visual Studio 尝试使用错误版本的 MSCRT dll。

我从构建的 DLL 中提取了以下程序集:

指示的 CRT dll 可以在 WINSxS 目录下找到x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700,以及许多其他版本。据我所知,这意味着库的正确版本应该按照此链接的建议在运行时链接

我尝试了各种摆弄链接器和清单设置的方法,包括以下内容:

  • 使用和不使用嵌入式清单进行构建。添加清单可修复 R6034 错误,但会出现 FileLoadException/side-by-side 问题。
  • 将 MSCRT dll 放在输出文件夹中并尝试链接到它们,而不是静态链接 .lib 文件。
  • 将代码生成运行时库从 /MD 更改为 /MT(/clr:oldSyntax 项目不支持,我仍然需要支持 VS2003,因此无法升级)。
  • 属性 -> 链接器 -> 生成清单:是(默认),否 -(相同的结果)
  • 尝试将 .NET 包装器移植到 VS2010 并链接到 VS2005 本机二进制文件 - 适用相同的问题和错误消息。

我经历了许多类似的问题和论坛帖子,到目前为止,没有一个提供的解决方案有效。任何人都可以帮忙吗?我对这个有点迷失了。

来自事件查看器的附加信息

在系统事件查看器中,错误按来源报告:SideBySide,全文:

为 S:\release\BlahNet.dll 生成激活上下文失败。参考错误信息:操作成功完成。

看起来像是 Daily WTF 的候选人。

更新:尝试从头开始没有运气

我通过从头开始构建 VS2005 项目文件并导入源进行了另一次尝试。我想当密钥签名系统出现故障时,我可能会做一些事情,如此所述。FileLoadException在尝试了建议的密钥签名方法后,我在尝试使用 DLL 时仍然得到相同的结果。

0 投票
0 回答
241 浏览

c# - 尝试 pinvoke 和 sxs。上下文被忽略并使用第一个 dll

我有两个不同版本的非托管 dll 和每个版本的清单。在我的 C# 代码中,我使用激活上下文来控制使用哪一个。然后我使用 P Invoke 进行实际调用。看来激活上下文的创建和激活是成功的。但是,上下文似乎被忽略了,无论哪个 dll 首先被调用,两者都使用。

P Invoke 可以与 SxS 一起使用吗?还是我设置不正确?

我在 C# 代码中对 C 函数的定义是:

我的清单只有我添加的程序集标识,以及 Visual Studio 2010 生成的 trustInfo。

谢谢您的帮助。

-缺口

0 投票
1 回答
1203 浏览

c++ - Resolving PE SxS imports Windows

I'm in the middle of writing my own version of the Windows Loader (albeit a very simple version) and thus far things have worked out fairly well. However, I've run into a little snag when it comes to recursively walking the Import table for the loaded module.

For most dependencies, things work out well and I can simply recursively load the module. However, for some dependencies, this just breaks the target process. Upon further investigation I realized that this is because of Windows Side-by-side assemblies. Essentially, the dependency in the loaded PE was a different SxS version of the module being used in the target process.

In one case, the DLL I was loading referenced msvcr90.dll, but the target process was using an earlier version of the runtime: msvcr71.dll.

Now, the windows loader can handle this fine, so there's obviously a "correct" way to do this. I've read up a bit on Activation Contexts, but they haven't really helped me grasp the issue.

Calling LoadLibrary itself doesn't resolve the dll to the correct version either

Simply returns 0. Does anyone know

a) How to detect if an import is a SxS assembly

b) How to resolve the import into the correct SxS version for the process.

I'm really stumped on how to do this. I know most of the PE file format from research now, but I'm pretty sure the SxS is beyond the scope of PE structure.

If you need any more info, just comment. The executable doesn't have an external manifest, and its embedded manifest doesn't specify the runtime version. It does, however, contain a copy of msvcr71.dll in its working directory, if that helps anyone at all.

Cheers.

0 投票
3 回答
4612 浏览

visual-studio - 无法运行应用程序的调试版本

带有 Vista/Win7 更新的 Visual Studio 2005 SP1。PC 最初安装了 VS 2010,但由于团队的其他成员使用的是 2005,所以在罗马时...

最初,我安装了 2005 和更新并尝试构建/运行。构建运行良好,运行(在调试模式下)失败。所以我卸载了 VS 更新,删除了所有版本的 VS 和相关组件,并重新安装了带有 SP 和 Win7 更新的 VS2005。

在调试模式下运行相同的问题。我收到一个对话框,告诉我应用程序配置不正确。检查事件日志显示:

运行 sxstrace 给了我:

查看 C:\Program Files (x86)\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT,清单文件包含:

如果我转到应用程序的调试(输出)目录,则有一个文件(ESM_Win32_App.exe.embed.manifest),其中包含:

我的 c:\windows\winsxs 目录包含:

x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.1833_none_d08b763a442c70c2 x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4027_none_d08a21a2442db2dc x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_d08d7da0442a985d x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.42_none_db5f52fb98cb24ad x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_d08cc06a442b34fc x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8 .0.50727.762_none_10b2f55f9bffb8f8

x86_microsoft.vc80.debugcrt_1fc8b3b9a1e18e3b_8.0.50727.42_none_ef74ff32550b5bf0 x86_microsoft.vc80.debugcrt_1fc8b3b9a1e18e3b_8.0.50727.762_none_24c8a196583ff03b

似乎 DLL 的运行时风格比调试多,但是,我什至没有 6195 DLL 的运行时版本,更不用说调试了。

我的 c:\windows\assembly\gac_32 不包含名为 Microsoft.VC80.DebugCRT 的目录,sxstrace 的输出似乎表明应该存在该目录。

因此,我收集到某些调试 DLL 未找到或未安装,但我不知道如何解决此问题。一个人没有这个问题,另一个人有。也没有任何想法。Visual Studio 似乎安装了 .762,我原以为它会被 SP1 和/或 Vista 更新升级......但我不知道如果是这样的话他们会在哪里,我只知道他们'不是我认为他们会在的地方。也许我需要安装另一个更新?我还发现我的 VS 正在尝试使用 .6195 的 DLL 令人费解,但是,它会从哪里获得该信息 - 它可能从其他 DLL 获得信息(即:可能来自其他组的那些?)因此尝试使用它认为是最新的吗?

0 投票
1 回答
1934 浏览

winsxs - WinSxS 安装

哪个安装程序在我的系统Windows\Winsxs文件夹中安装了以下文件?

我是否需要版本 8.0.50727.5592 或更高版本的相同文件?

0 投票
1 回答
1192 浏览

vb6 - 用 VB6 开发无注册 COM 应用程序

我正在维护一个带有许多 COM 组件(DLL 和 OCX)的 VB6 应用程序。为了简化开发和部署,我想使用 reg-free com。开发的问题是应用程序在 VB6.EXE 实例中运行。如何欺骗 VB6 使用我的(未注册的)组件?在分支之间切换时不必通过注册/注销组件对我来说非常重要。为 VB6 生成 .manifest 文件并非不可能,但是否有其他更优化的方法可以在启动 VB6.EXE 时指定 .manifest 文件?

注意:Activation Context API 似乎没有帮助,即使在开发环境中使用也是如此。

我想到的解决方案:

  • 从清单激活上下文并将 VB6 作为子进程启动的实用程序应用程序(不起作用;进程不继承激活上下文)
  • 在启动时将上下文激活注入 VB6 进程(太复杂;必须破解可执行文件才能执行此操作)
  • 在激活正确的上下文后在我自己的进程中托管 VB6(甚至无法确定这是否可能)
  • 使用 VB6 加载项或在 VB6 中运行的其他实用程序来激活上下文(尝试过,但似乎不起作用)

1月16日更新

正如wqw所建议的,我使用 VB.exe.manifest 进行了一些测试。VB6.exe.manifest 有效,但有一些注意事项:

  • 清单中指定的 SxS dll 不会出现在未实际引用该组件的项目的引用窗口中
  • 在确实引用该组件的项目上,它将按照以下顺序显示在目录中:

    1. 项目文件中记录的路径名(如果文件仍然存在)
    2. 路径名,就好像它与项目位于同一文件夹中一样 (vbp)

    如果文件不在这些文件夹中,则项目将无法编译(仅运行代码会导致 VB6 中的内部编译)并显示消息“找不到项目或库”。

显然,VB6 实际上会扫描注册表以查找 COM 组件,并在编译期间验证它们是否存在于它们所说的位置。如果我真的想使用 VB6.exe.manifest 来重定向 COM 组件实例化,我不确定这可能意味着什么。也许在某个预定义的位置拥有虚拟组件文件可能会诱使 VB6 相信一切都是应有的,尽管加载了一组完全不同的组件以供使用。

进一步更新:

我对最后一个假设进行了测试,结果证明它是错误的。该组件必须实际存在才能编译项目。它甚至必须正确加载(不接受虚拟的零长度文件!)。现在我什至不确定清单是否有效。这是一个更耗时的测试(需要一个具有两个版本的组件,产生不同的结果,一个用于项目,一个用于清单)。

0 投票
2 回答
4383 浏览

visual-studio-2008 - R6034:尝试加载 C 运行时库不正确

我正在使用 botan Libary 在 vs 2008 上生成二维码我收到错误“R6034:尝试错误地加载 C 运行时库”。其MFC/C++应用及
MFC的使用:在共享DLL
代码生成中使用MFC :《多线程调试DLL(/MDd)》

我已经在四分钟内完成了线程,他们说需要添加清单文件,我已经有一个,请帮我解决这个问题

这是我的 App.exe.manifest.v “sigcheck.exe - m QrCodeTest.exe”

输出:

依赖关系 我针对依赖关系运行了Debug exe,这里botan应该加载MSVCP90.dll和MSVCR90.dll而不是MSVCP90D.dll和MSVCR90D.dll。这是造成混乱的原因吗?如果是如何纠正它。

在此处输入图像描述