问题标签 [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 投票
1 回答
671 浏览

visual-studio-2008 - 一些应用程序如何能够简单地解压缩并在 Windows PC 上运行而不会出现 SxS 问题?

某些团体普遍抱怨说,在 Windows 上安装会在整个文件系统和注册表中散布东西,并且某些应用程序提供了简单地解压缩文件的选项,因此您可以“卸载”只是删除。但是他们如何避免 Visual C++ Redist、Side-by-Side (SxS) 等所有丑陋的东西呢?

我有一个小实用程序,实际上我更喜欢只分发一个正在运行的 .EXE - 根本没有安装程序,甚至因为它很小,所以甚至解压缩。这可行吗?

编辑: 正如建议的那样,我尝试使用对运行时的静态依赖(/MT 而不是/MD)进行构建。我得到以下内容(为了清楚起见,中间部分被截断):

0 投票
1 回答
3393 浏览

windows - 如何解决“两个同名的程序集”

我有一个使用 CRT 版本 8.0.50727.5592 的应用程序。依赖库之一使用版本 8.0.50727.762。当我在安装了版本 8.0.50727.4940 的机器上运行应用程序时,我收到“并排配置不正确”错误。使用 sxstrace,我得到以下结果:

在我看来,对 762 版的依赖似乎正在“升级”到 4940 版,而对 5592 的依赖显然不能。

我已将包含 CRT 版本 5592 的“Microsoft.VC80.CRT”文件夹复制到我的应用程序文件夹中(即,将程序集部署为私有程序集)。似乎在最后被识别,其中 sxstrace 说:

唉,由于某种原因,当解决对版本 762 的引用时,看不到这一点。如何强制对版本 762 的引用指向与我的应用程序一起分发的版本 5592?

我认为问题出在哪里是错的吗?

谢谢你的帮助!

0 投票
1 回答
712 浏览

com - 如何调试免注册表 COM?

我有一个混乱的情况,包装了几个 3rd 方 COM 组件。实际上它是一个 COM 组件和几个 .NET 程序集。.NET 程序集又依赖于相同的第 3 方的内部 COM 组件。当我注册了 COM DLL 后,我的代码可以正常工作(现在我正在从 C# 进行测试)。当我不这样做时,它会失败。调试它的最佳方法是什么?

我通过添加对 COM 组件的引用、设置 Isolated=true、然后将生成的 comClass 元素从清单中提取到我自己的 SxS 清单中来生成 SxS 清单。此外,它似乎创建了一个 Interop.XXX.dll 文件:这是为了什么?

一些示例错误消息:

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 投票
3 回答
16349 浏览

visual-studio-2010 - Visual Studio 可再发行和并排/DependentAssembly 错误

(我正在运行 Windows7 并使用 Visual Studio 2010。)

我在 .NET Azure 项目中使用 ClamAV,每当我运行 clamd.exe 时,我都会遇到并行错误,无论是通过我的代码还是通过自己运行 clamd.exe。

在 Visual Studio 2010 中,我收到错误消息:

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

在事件查看器中,我得到:

“C:\Users\pconerly\code\AntiVirus_source\WorkerRole\clamav\clamd.exe”的激活上下文生成失败。相关程序集 Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195" 找不到。请使用 sxstrace.exe 进行详细诊断。

当我搜索“8.0.50727.6195”时,它把我带到了 2005 年的 redist,所以我下载了它 http://www.microsoft.com/download/en/details.aspx?id=3387

重新启动后,我仍然收到并排错误。此外,我认为 redist 安装程序没有完成它的安装 - 就像它看到 Visual Studio 2010 并说“哦,这已经足够好了,我不需要安装”。我没有尝试卸载 2010 并使用 2005,因为我的开发团队的其他成员正在使用 VS 2010。

这是怎么回事?如何解决这个问题?我准备拔掉我的头发。

0 投票
1 回答
3385 浏览

installshield - 安装 Shield-Merge 模块依赖问题。DLL没有注册

我的问题:

我创建了两个合并模块。让我们称它们为 A 和 B。合并模块 B 依赖于 A。A 将 aaa.dll 并排安装到 Windows。B 包含 bbb.dll,它在安装过程中注册并依赖于 aaa.dll。作为旁注,合并模块 A 是在 Install shield 2012 中创建的,合并模块 B 是使用 Visual Studio 2010 向导创建的。

我有一个安装屏蔽项目,它安装了两个合并模块。我进入 Application Data-> Redistributables 并将 B 添加到安装中。这会自动检查 A。如果我转到 Organization->Setup Design 并展开包含 B 的功能,然后单击 B。它会显示有关 B 的信息的窗口。其中有一个正确列出 A 的 Dependencies 标题。

我构建项目并尝试将其安装在干净的 VM 上。在安装过程中我收到一条错误消息,说 bbb.dll 注册失败我想忽略,取消。此时我在机器上查看了winsxs,并注意到aaa.dll 不存在于它的正确文件夹中。相反,它存在于 winsxs\InstallTemp\ 子文件夹中。然后,如果我在错误弹出窗口上单击忽略,安装将继续,不会出现更多错误。然后完成后我可以手动注册 bbb.dll 就好了,并且 aaa.dll 存在于正确的 winsxs 子文件夹中。

我的问题是如何让合并模块 A 完全完成并将 aaa.dll 放置在正确的位置,以便一切都能正确安装?

我尝试过的事情:

  1. 我尝试在组织->设置设计下的安装盾项目中制作多个功能。所以我创建了 3 个功能。顶部的特征 1 仅包含 A。特征 2 包含 A 然后 B。最后特征 3 再次包含 A。我完成了所有 3 个必需的功能。我希望这意味着整个功能将完成安装并将 aaa.dll 放置在正确的并排位置。然而,没有这样的运气。(我创建了 3 个功能,以防万一我有倒序之类的东西)
  2. 我相当确定问题在于 aaa.dll 没有及时安装或安装在正确的位置。为了测试这一点,我首先尝试使用刚刚安装合并模块 A 的 install shield 安装程序安装 aaa.dll。然后我运行我的主安装程序,一切正常。

很抱歉文字墙和任何不正确的语法\拼写。如果我自己弄清楚这个问题,我会发布,以防其他人最终遇到这个问题,因为这真的很令人沮丧。

0 投票
1 回答
928 浏览

c# - 由于 DLL 依赖于其他 SXS-DLL,pinvoke 失败

简而言之:当 A.dll 依赖于另一个 SXS-lib(在我的情况下为 MSVCR90.DLL)时,如何使用 p/invoke 从 DLL A.dll 调用函数?

我想使用 pinvoke 在 DLL 中调用一个函数。pinvoke 本身适用于其他库。从非托管 C++ 调用 DLL 中的函数也可以正常工作。

问题是 DLL 引用了一些 SXS 文件夹中的 MSVCR90.DLL。

使用 C++ 中的 LoadLibrary,可以如上所述使用该库。使用 C# 我不知道如何加载库。我总是收到计算机上缺少 MSVCR90.DLL 的错误消息。

这是加载库的样子:

调用该函数sample时,我只收到以下错误:HRESULT: 0x8007007E 表示找不到该库。实际上,该库存在于 SXS 目录中的各种版本中。

我尝试使用 Dependency Walker (depends),但到目前为止它也无法找到正确版本的库。

该库还附带了一个清单,其中包含以下条目:

清单中包含以下语句:

请求的版本存在于我的机器上,我使用的是 VS 2010,它提供了该库的较新版本,但我想这应该不是问题。

我发现很多讨论类似问题的线程。我知道,我有一个依赖问题,但我无法找到解决方案。我知道我缺少依赖项,我有一个清单,但 C# 也应该这样做吗?不仅适用于非托管 C++?

0 投票
2 回答
1418 浏览

c# - C++ 和 C# 之间的并行依赖关系

我正在使用 FireBreath 框架制作浏览器插件。大多数逻辑都是用 C# 编写的,为了从浏览器中调用它,我制作了一个 C++ 包装器。浏览器调用 C++ 本机代码,该代码调用“代理”托管 C++ 代码,该代码调用 C# 项目中的实际逻辑。

所以我有3个dll:

  • 依赖于托管 C++ 的原生 C++ dll;
  • 托管 C++,它依赖于 C#;
  • 包含主要逻辑的 C# dll。

所有 3 个 dll 都安装到用户目录 (c:\Users\\AppData\Roaming\MyCompany\MyApp\1.0.0.0)

问题是浏览器不加载 C# dll。我使用 Side by Side 清单来声明依赖项。

我试图制作一个单独的清单文件来声明一个程序集:

并将此依赖项的链接添加到头 dll(本机 C++):

我还尝试直接在头 dll(Native C++)中声明依赖项:

尝试使用 #pragma 指令链接依赖的 dll:

我使用 Dependency Walker 检查了依赖关系,它确认了托管 C++ 和 C# 之间的依赖关系不存在。

插件可以访问头 dll(本机 C++)并且它也加载托管 C++ 但是当托管 C++ 调用 C# dll 时 - 插件失败,找不到 C# 程序集。

如果我将 C# dll 与浏览器应用程序(firefox.exe 或 chrome.exe)放在同一目录中 - 它可以工作。

看起来并排依赖在托管 C++ 和 C# 之间不起作用。

如何为我的插件加载依赖的 dll?

0 投票
1 回答
1182 浏览

com - 使用来自另一个目录的 dll 的 COM 并排程序集?

我很确定答案是否定的,但以防万一:

对于具有适当 SxS 清单的独立 exe,是否可以使用相对路径引用 COM DLL 或从不是当前目录的目录加载它们?

我们在一个网格环境中运行,该环境使用一个公共文件夹作为根来部署各种包(即 zip 文件)。多个应用程序希望从一个公共位置引用一个公共 COM Api(带有 DLL 清单)。然而,由于网格环境是沙盒环境,我们不能安装到 Windows SxS 目录,也不能带外(即不由网格部署)。

我是否希望从..\SomeCommonDir\COM.dllC:\Program Files\SomeCommonDir\COM.DLL 加载 COM.DLL

作为私人集会,一切正常。

0 投票
1 回答
167 浏览

.net - 如何在 .net 4 进程 (SxS) 中强制在 .net 2.0 下执行托管代码

在一些文章中,人们提到“显式运行 sxs”。真的有可能吗?我已阅读有关该主题的几篇文章:http:
//msdn.microsoft.com/en-us/magazine/ee819091.aspx
http://blogs.msdn.com/b/dotnet/archive/2009/06/03 /in-process-side-by-side-part1.aspx
http://msdn.microsoft.com/en-us/library/ee518876.aspx

但目前尚不清楚是否可以强制在 .net 4 进程的旧 .net 版本下执行一段托管代码。

到目前为止,似乎只有 COM 组件需要较旧的 .net,因此 .net 4 clr 将自动启动 SxS 执行。有人可以阐明这个问题吗?