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

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

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

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

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

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

谢谢您的帮助。

-缺口

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 投票
1 回答
898 浏览

.net - SXS 如何选择应该加载哪个框架版本?

我目前正在努力让 .NET 程序集(带有 COM 类)免费注册。它运作良好,但是我有一个问题,我似乎无法确定确切的原因。

我的问题是,程序集绑定没有在正确的 .NET Framework 版本上完成。

我目前有 2 个程序集(我们称它们为 A.dll 和 B.dll),它们都是使用 .NET 4.0 构建的。

B.dll很小,我做了它来测试免注册激活。它旁边有一个清单,B.dll.manifest)。它包含 1 个具有 1 个属性和 1 个方法的类。

A.dll 要复杂得多,经过签名,它的清单作为构建后事件的资源嵌入(使用 mt.exe)。

我制作了一个 VB6 应用程序来测试它们。我的应用程序有一个清单,它声明了依赖项。

如果我运行我的应用程序,B.dll 运行良好,但 A.dll 没有。使用 fuslogvw.exe 查看绑定日志,我发现 A.dll 的绑定是使用 .NET 2.0 尝试的,而 B.dll 是使用 .NET 4.0 完成的。

A.dll 最终失败,错误代码为 0x8013101b,即 COR_E_NEWER_RUNTIME。ERR:从文件中提取清单导入时出错(hr = 0x8013101b)。

为了让它工作,我必须用这个内容向我的 VB6 应用程序添加一个 .config 文件

然后,它绑定到正确的框架版本并且可以工作。

我认为,MT.exe 可能更改了我的程序集中的属性/元信息,使其认为应该加载 2.0。所以我使用 ILSpy 打开它。我在那里看到的一切都在谈论 4.0,没有任何可疑之处。

我已经读过默认情况下应该使用用于构建 em 的固件加载程序集(在我的情况下,它们都是 4.0,任何地方都没有 2.0)。所以,我不明白为什么它会尝试使用 2.0 加载那个特定的。

这对我来说是一个问题,因为我想避免创建/维护,但最重要的是为所有将使用此特定程序集的应用程序部署这些 .config。在我的特殊情况下,这意味着大约有 100 个 .config 文件。

以供参考:

我使用的 MT.exe 来自 7.0A SDK,版本为 5.2.3790.2076。

这是 fuslogvw.exe 输出(对不起法语和混乱的重音字符,重要的部分是框架版本号)

B、工作

A、不工作

A,工作(感谢配置文件)

0 投票
1 回答
1653 浏览

java - Java SxS(并排)配置

我正面临一个非常模糊的问题,而我正在尝试在 Windows 中并排(SxS)运行 Java 应用程序。

我已经完成了创建 java.exe.config 和 java.exe.manifest 文件的所有准备工作,这些文件与 JRE 位于同一文件夹中。

当我从命令行调用应用程序时(通过启动 .bat 文件),应用程序运行正常。.bat 文件使用 SxS 配置的 Java(这是我正在运行的应用程序框中唯一的一个)

但是,当我尝试从另一个 Java 进程中调用它时(Runtime.getRuntime.exec()使用 ProcessBuilder我必须补充一点,父 Java 进程也是由为 SxS 配置的 Java.exe 启动的。因此,我会假设“ Runtime.getRuntime(), ProcessBuilder()”会给我 Java SxS 加载环境。

使用一些 Windows 工具(procexp.exe、procmon.exe)进行进一步调试时,我发现了以下内容:当我从 .bat 文件启动应用程序时,crss.exe 通常会读取 .manifest 文件(因为它应该是)。但是,当 Java 生成另一个进程时,根本不会考虑 .manifest 文件。我能想到的一个可能的问题是启动进程的 Java.exe 的当前目录与 java.exe.manifest 文件所在的目录不同。

我唯一能想到的是java启动器中的一个错误/问题(或者他们称之为功能)。

有没有人有类似的问题?任何人都可以阐明上述内容吗?非常感激。

到目前为止,我已经尝试了以下方法:

  • 从 .bat 文件中运行 java 进程。工作过
  • 使用从父 Java 进程调用 java 进程Runtime.getRuntime().exec(). DID NOT WORK
  • Invoked the .bat file from a parent Java process using Runtime.getRuntime().exec(). 不工作
  • 使用 ProcessBuilder 设置 .manifest 文件所在的当前目录。不工作
0 投票
1 回答
182 浏览

java - Java中的Spawn过程,类似于双击

我有一个 Java 应用程序,我想生成一个新进程(启动一个 .bat 文件),它基本上会做与双击它相同的事情。

为了产生这个过程,Runtime.getRuntime().exec()我已经尝试了这两种方法。ProcessBuilder这两种方法都有效(它们可以启动 .bat 文件),但我的问题是它们实际上并没有做与双击它完全相同的事情。

更具体地说,这个 .bat 文件启动了一个配置为使用 Windows SxS(并排)运行的 JVM (java.exe MyMainClass)。因此,我创建了适当的java.exe.configjava.exe.manifest文件。当我点击它时,java 应用程序启动并且适当的 .dll 被成功加载(因为我需要 SxS)。

ProcessBuilder我的问题是,当我使用or启动完全相同的 .bat 文件(具有完全相同的参数和进程环境)时Runtime.getRuntime().exec(),它似乎没有考虑到我的 SxS 配置,因此我需要的 .dll 是根本没有加载,导致错误。

有没有人知道如何启动这个 .bat 文件,就像我双击它时 Windows laucnhes 一样?此外,是否有人对 Java SxS 部署有任何经验?我无法真正理解为什么 ProcessBuilder 会忽略我的 SxS 配置。

提前致谢。

0 投票
1 回答
283 浏览

c++ - 如何并排加载同名 DLL (Visual Studio)

我有一个关于side-by-side assemblies.

情况如下:

我有一个可执行文件,它通过搜索目录app.exe来加载插件。取决于一定的。pluginsapp.exeA.dll

我正在开发一个插件,该插件依赖于A.dll具有相同名称的旧定制版本。将这个较旧的定制版本更新到较新版本是不可能的,所以我想我可能能够同时加载这两个A.dll文件。

这是目录结构:

这两个版本A.dll本身都依赖于大量其他 DLL,这些 DLL 可能存在类似的版本问题。(我还应该提到我正在使用 64 位应用程序,如果这会有所不同的话。)

如何在 Visual Studio 中进行设置,以便我可以同时加载两个A.dll库,以便myplugin.dll使用旧版本,而app.exe使用新版本?

0 投票
1 回答
1581 浏览

windows - 无法执行我的程序的 64 位版本

我只是想构建现有程序的 64 位版本(带有一些依赖 DLL 的 EXE)。由于在 Linux 下它很容易(只需重新编译它),我很乐观它在 Windows 下可能会有点相似。不幸的是,它不是...

启动我新编译的 EXE 后,我收到一条错误消息

追查它的原因,我做了一个 SxS 跟踪,显示以下错误消息:

那么这是什么意思?我该如何解决这个问题?为 x64 安装 VS2010-redistributable 包不是诀窍,这里安装程序抱怨已经安装了一个较新的版本......

Manifest 文件中提到了一些 X86 ......是这个原因吗?如果是:我怎样才能找出它仍然依赖于哪些 X(& DLL?

0 投票
1 回答
275 浏览

c# - C#、sxstrace 和视觉工作室

我有个问题。有时,会发生一些并行错误。获得此类错误解决方案的一个帮助是,有一个很好的工具,称为 sxstrace.exe。

所以当我启动我的程序(TestProgram.exe)时,manifest文件中有一些错误,所以弹出一个错误,然后我可以使用sxstrace获取信息,为什么会出现这个错误。

但我有一个问题。当我在 C# 中使用 sxstrace.exe 启动一个进程,并在清单失败的情况下启动我的程序 (TestProgram.exe) 时,sxstrace.exe 不会跟踪任何错误。从 shell 启动 sxstrace.exe,它将跟踪所有错误。

问题来了:为什么会这样?如何从 C# 启动 sxstrace.exe,以便跟踪所有错误?

编辑:至于 C# 程序(正在启动 sxstrace 进程)是从管理员权限开始的,我想,sxstrace 进程也以管理员权限开始。

0 投票
0 回答
130 浏览

c++ - Visual Studios:应用程序无法启动,因为配置不正确,SxS 错误

我有一个 Visual Studios 2010 项目,它的编译没有任何问题。当我去运行它时,我遇到了:

此应用程序无法启动,因为应用程序配置不正确。

这是昨天早上编译和运行的,但现在它不再运行了。我恢复到原来的版本,但我仍然得到同样的错误。

我跑了 sxstrace,输出是:

我看到有很多对调试 CRT 的引用,但是我将我的项目设置为发布模式,并且我没有链接到任何外部第三方库。

我试图重新安装视觉工作室,但没有奏效。有谁知道出了什么问题?

0 投票
0 回答
1254 浏览

c# - 在没有代码库/GAC 的情况下将免注册 COM 互操作与 C# .NET DLL 一起使用?

我有一个通过 COM Interop 公开的 C# .NET DLL,为此我生成了一个清单文件。DLL 正在通过 Excel VBAProject 使用CreateActCtxCreateObject创建我的对象。

一切正常,但是……我需要致电regasm MyProject.dll /codebase或向 GAC 注册。否则我得到ActiveX component can't create objecterror in dll错误。

是否可以使用 .NET DLL 而无需注册 DLL?我以前可以使用基于 VB6 的 DLL 和清单文件来执行此操作。