问题标签 [side-by-side]

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 回答
6122 浏览

windows - 使用清单在 LoadLibrary 中搜索 Windows 路径

如果您在LoadLibrary没有路径的情况下调用(例如,LoadLibrary("whatever.dll")Windows 通常会遵循其标准搜索算法,与它用于查找 EXE 的算法相同。

我的问题是:假设应用程序清单指定了系统 DLL 的特定版本,例如 comctl32.dll 6.0。在这种情况下,会LoadLibrary("comctl32.dll")立即转到正确的并排文件夹,还是仍然执行某种搜索?

0 投票
3 回答
392 浏览

.net - 使用版本化的 .Net 程序集

在我们的处理软件中,我们正在从外部组件的一个版本迁移到更新的版本。虽然程序集执行的总体任务是相同的,但 API 完全不同,并且没有保持向后兼容性。API 负责从外部站点提取数据,这些站点可能与匹配的新旧 API 一起运行(也没有向后兼容性)。我们无法控制外部程序集或外部工作站中的软件。外部程序集没有强签名,并且程序集中的模块在两个版本中具有相同的名称。

我们不想维护我们的处理软件的两个版本,而是希望动态地发展它并让它使用旧版本或新版本的外部组件,这取决于外部站进行联系。我们能够确定外部站是否支持新版本,因此“版本”的选择可以或多或少明确。

所以设置是我们有两个版本的外部程序集 ComLib.dll。我们可以从同一个程序集/项目中引用这两个版本吗?在确定类型等时我们如何区分这两个程序集?

假设上述内容不能在单个程序集/项目中完成,我们可以实现特定于版本的“适配器”程序集,每个版本的外部程序集一个(我认为我们已经为此准备了足够的接口和抽象),但是我们应该注意一些警告或一些特定设置以避免运行时的类型/版本混淆(程序集解析/加载等)?对于此设置,.NET 运行时是否有足够的“并行”支持?

更新:这个问题的进一步扭曲只是为了让事情变得更有趣。似乎外部程序集加载了其他程序集并使用了外部配置文件。由于不同的版本需要不同的配置文件和不同的附加程序集,每个版本都需要以某种方式加载与其版本相匹配的附加程序集。

在我看来,我们想要的是每个版本的程序集在包含其配置文件和其他程序集的单独文件夹中加载一个“根”。这甚至可以通过标准程序集解析器/加载器实现,还是我们必须做一些魔术并手动加载程序集(在单独的 AppDomains 中?)以强制执行“根”文件夹?

0 投票
5 回答
2763 浏览

c# - 无法在 Vista x64 的 C# 应用程序中加载 C++ DLL

我有一个用 C++ 编写的 DLL,需要由 C# 中的应用程序使用。它在 Vista x86 下运行良好,但在 x64 下无法加载。因此,我构建了 DLL 的 x64 版本,并检测操作系统是 x86 还是 x64,并对适当的 DLL 使用适当的互操作调用。这在 Vista x86 下工作正常,但在 Vista x64 下,当它尝试加载 DLL 时出现“并排”错误。为什么它无法加载它,可以做些什么来纠正这个问题?(如果您需要更多信息,请告诉我,我不确定哪些信息与解决此问题相关。)

0 投票
1 回答
700 浏览

visual-c++ - 当版本之间存在已知问题时,为什么 Windows 并排 (winSxS) 安装自动升级策略?

我们有一个使用 MSVC 2K5、SP1(版本 762 msvcrt80)编译的应用程序

一切都很好,直到有人在同一台机器上安装 .Net3.0SP1,同时安装了 msvcrt80 版本 1433 和自动升级策略。

现在我们到处都是随机崩溃和不满意的客户。

我知道我们可以调整清单文件以强制使用特定版本,但我只发现了复制自动生成的细节并手动修改它的非常丑陋的方式。对于要修复的大量应用程序,这尤其令人不快

我们可以摆脱 winSxS 目录中愚蠢的“升级”策略吗?是否有一个选项/标志只为特定版本编译并且仍然自动生成清单?

0 投票
4 回答
1884 浏览

c++ - 如果在 WinXP 上的调试版本中使用 boost (C++) 库,则无法执行程序

我正在为几个 C++ 项目使用 boost。我最近进行了升级(从 1.33.1 升级到 1.36,很快升级到 1.37),从那时起我就不能再运行任何调试版本了。

为确保不存在其他项目问题,我创建了一个最小测试项目,其中仅包含 boost.thread,并使用它来启动一种方法。可以启动发布构建,但不能启动调试构建,尽管Dependency Walker显示找到了所有必需的库(这也意味着在 SxS 目录中找到了所需的 MS Debug CRT)。

在启动时我只得到:

Die Anwendung konnte nicht Richtig initialisiert werden (0xc0150002)。Klicken Sie auf "OK", um die Anwendung zu beden。

这意味着“无法初始化应用程序”。互联网研究主要导致MS Office 安装问题,建议对 WinXP 进行修复。

那么,除了修复设置(我认为这在我谈论调试 dll 问题时无济于事)之外,还有什么想法吗?

啊,在我忘记之前:完全相同的源代码在构建机器上不会导致错误(即,可以注册 DLL,意味着执行)。所以这显然是一个安装问题,但是由于 DLL那里,并且dependency-walker 找到了它,我还忘记了什么?

编辑)好吧,我还没有解决我的问题,但感谢 deemok,我更进一步。为了减少误解,我在下面做一些澄清:

  • 程序无法在开发者机器上运行
  • 我正在使用已安装的 VS2005(这是一个 VC++8 项目)
  • 我使用了来自BoostPro的 boost-setup ,编译了所有可能的构建版本,并仔细检查了它们是否存在(否则我在构建过程中已经遇到了链接器错误)。
  • 我仔细检查了我能想到的 include/lib/bin 配置的任何角落——因为 boost 在 Windows 上使用自动链接,具有特殊的命名约定,构建或启动会失败,更容易理解错误信息。
  • 不能使用静态链接,因为 boost.thread 需要动态链接 DLL 项目(我可能会在这里搞砸,但由于这个问题似乎只发生在我的机器上,我不想搞砸这个,我确定助推器首先有理由将检查放在那里)
  • 正如我写的那样,我检查了 Dependency Walker,它说一切都很好。

目前,它似乎是 boost-dll 中的一个错误(可能是不正确的 Manifest),将对其进行检查。

0 投票
3 回答
689 浏览

c++ - 如何使用 Visual Studio 2008 构建在普通旧 XP SP2 上运行且没有并行 DLL 的 C++ 应用程序?

我想通过一次调用来编译一个 C++ 项目,WinExec以便使用一些命令行参数启动另一个可执行文件。我不知道在我的项目中要指定哪些设置才能生成不需要 Microsoft 并行 DLL 的可执行文件,我不想在我的目标系统上安装它。有什么提示吗?

症状是应用程序无法启动并且以下事件被写入应用程序日志(免费翻译自法语):

更新:我知道使用WinExec是不好的做法,但它就像一个魅力,微软不可能在任何未来的 API 版本中删除它,不是吗?

0 投票
2 回答
1361 浏览

windows - 免注册 COM 无法在 Windows Server 2003 上运行

我已经为我的 COM 服务器 DLL 和客户端应用程序创建了必要的清单,以便在 Windows XP 中免注册。我已经测试了各种组合(有和没有注册),并且在所有情况下,如果清单存在,客户端应用程序会看到库的并行版本,如果没有(或 COM 错误),则看到已注册的如果根本没有注册)。我已经在我的 Windows XP 开发机器上进行了测试,并将文件(DLL、客户端 EXE 和每个清单)提供给同事,他们也在自己的 Windows XP 机器上成功运行了所有内容。清单是外部 XML 文件,而不是嵌入式资源。到现在为止还挺好。

但是,当我将文件复制到 Windows Server 2003 机器时,它不起作用。我得到一个静默失败,但在应用程序事件日志中出现应用程序错误(见下文)。如果我取消注册 DLL 并删除清单,我会收到类似的错误(在命令提示符下无声,但在事件日志中出现应用程序错误)。显然在查找注册时存在一些问题。我已经在我们公司可以访问的每台 Windows Server 2003 机器上复制了这个。根据有关并行/免注册 COM 的 Microsoft 文档,它应该适用于 Windows XP 及更高版本,以及 Windows Server 2003 及更高版本。

需要明确的是,相同的客户端在相同的 Windows Server 2003 机器上针对相同 COM DLL 的注册使用 regsvr32)版本在我尝试用于免注册 COM 的相同登录凭据下完美运行。换句话说,不存在伪装成免注册 COM 问题的内在问题 - 当服务器在注册表中全局注册时,此客户端和服务器运行良好。

有人对如何进一步调查有任何想法吗?我不是 Windows Server 方面的专家,但是否可能需要更改某些策略设置才能启用此支持?如果我能找到必要的更改,我们的技术支持/基础设施人员可能不会这样做,但我不能依赖他们来研究这个问题,因为他们已经被淹没了。

万一它很重要(我认为它不应该,但你永远不知道)DLL 是用 Delphi 2007 编写的,而客户端是用 Visual C++ 编写的。

0 投票
3 回答
16922 浏览

.net - “激活上下文生成失败”投诉尝试添加应用程序清单

我正在尝试向我的 .NET 2.0 EXE 添加需要提升的应用程序清单。我已经为一个简单的 EXE 做到了这一点,它没有任何问题,但在这个更复杂的 EXE 上它不起作用。

我的 EXE 在我的解决方案中有一个配置文件和许多其他 DLL 的依赖项。

当我启动 EXE 时,我得到一个 SideBySide 错误说“ Activation context generation failed for "C:\MyCompany.MyProduct.WinUI.exe".Error in manifest or policy file "C:\MyCompany.MyProduct.WinUI.exe.Config" on line 1. Invalid Xml syntax.

我的配置文件与清单文件有什么关系?这是我的清单:

0 投票
2 回答
507 浏览

windows - 使用 Windows Installer 启动依赖并行程序集的服务

我们正在为 Windows Server 2008 更新我们产品的 .msi 包的构建。我们安装的主要组件是作为 Windows 服务运行的应用程序。还有一个配置应用程序在安装期间运行以设置注册表项以供服务使用。

服务和配置应用程序依赖于 Microsoft C/C++ 运行时和 MFC,它们作为合并模块包含在 .msi 中。C/C++ 运行时和 MFC 的程序集在 InstallFinalize 期间提交,这似乎阻止了使用 Windows Installer 提供的机制启动服务(这是正确的吗?)当然,我们看到并排错误与 at如果在 InstallFinalize 之前运行,则至少配置应用程序。

我们采用的方法是在 InstallFinalize 之后将配置应用程序作为“提交”自定义操作运行,并让该应用程序启动服务。这要求应用程序以提升的特权执行(为此我们使用包含 trustInfo 部分的清单。)这进一步要求 .msi 配置为在没有模拟的情况下运行此应用程序(否则会混淆特权提升。)

这是一种可接受的方法吗?这有多大可能是面向未来的?有什么需要注意的问题吗?

看来这是别人遇到过的问题:

http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg12666.html

是否有官方(或非官方)接受的方式来处理此类问题?

作为对此的补充,是否有任何方法可以确保在安装过程中作为自定义操作运行的应用程序在启动时获得焦点?以这种方式启动的应用程序似乎总是在安装程序后面弹出并且安装程序保持焦点,这不是一个特别用户友好的效果。

非常感谢,

布鲁斯。

0 投票
3 回答
2690 浏览

c# - 有没有办法免注册激活EXE COM组件

有没有办法激活一个 COM 组件,它是一个EXE COM 应用程序,也是它依赖的 COM dll?我想从 .NET 应用程序(VS 2005/VS 2008)激活这个 COM 组件。

调用路径是 C# 应用程序 --> 调用进程外 exe(这是通过 COM),然后这个进程外调用几个 COM dll