问题标签 [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.
c# - 尝试 pinvoke 和 sxs。上下文被忽略并使用第一个 dll
我有两个不同版本的非托管 dll 和每个版本的清单。在我的 C# 代码中,我使用激活上下文来控制使用哪一个。然后我使用 P Invoke 进行实际调用。看来激活上下文的创建和激活是成功的。但是,上下文似乎被忽略了,无论哪个 dll 首先被调用,两者都使用。
P Invoke 可以与 SxS 一起使用吗?还是我设置不正确?
我在 C# 代码中对 C 函数的定义是:
我的清单只有我添加的程序集标识,以及 Visual Studio 2010 生成的 trustInfo。
谢谢您的帮助。
-缺口
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 不会出现在未实际引用该组件的项目的引用窗口中
在确实引用该组件的项目上,它将按照以下顺序显示在目录中:
- 项目文件中记录的路径名(如果文件仍然存在)
- 路径名,就好像它与项目位于同一文件夹中一样 (vbp)
如果文件不在这些文件夹中,则项目将无法编译(仅运行代码会导致 VB6 中的内部编译)并显示消息“找不到项目或库”。
显然,VB6 实际上会扫描注册表以查找 COM 组件,并在编译期间验证它们是否存在于它们所说的位置。如果我真的想使用 VB6.exe.manifest 来重定向 COM 组件实例化,我不确定这可能意味着什么。也许在某个预定义的位置拥有虚拟组件文件可能会诱使 VB6 相信一切都是应有的,尽管加载了一组完全不同的组件以供使用。
进一步更新:
我对最后一个假设进行了测试,结果证明它是错误的。该组件必须实际存在才能编译项目。它甚至必须正确加载(不接受虚拟的零长度文件!)。现在我什至不确定清单是否有效。这是一个更耗时的测试(需要一个具有两个版本的组件,产生不同的结果,一个用于项目,一个用于清单)。
.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,工作(感谢配置文件)
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 文件所在的当前目录。不工作
java - Java中的Spawn过程,类似于双击
我有一个 Java 应用程序,我想生成一个新进程(启动一个 .bat 文件),它基本上会做与双击它相同的事情。
为了产生这个过程,Runtime.getRuntime().exec()
我已经尝试了这两种方法。ProcessBuilder
这两种方法都有效(它们可以启动 .bat 文件),但我的问题是它们实际上并没有做与双击它完全相同的事情。
更具体地说,这个 .bat 文件启动了一个配置为使用 Windows SxS(并排)运行的 JVM (java.exe MyMainClass)。因此,我创建了适当的java.exe.config和 java.exe.manifest文件。当我点击它时,java 应用程序启动并且适当的 .dll 被成功加载(因为我需要 SxS)。
ProcessBuilder
我的问题是,当我使用or启动完全相同的 .bat 文件(具有完全相同的参数和进程环境)时Runtime.getRuntime().exec()
,它似乎没有考虑到我的 SxS 配置,因此我需要的 .dll 是根本没有加载,导致错误。
有没有人知道如何启动这个 .bat 文件,就像我双击它时 Windows laucnhes 一样?此外,是否有人对 Java SxS 部署有任何经验?我无法真正理解为什么 ProcessBuilder 会忽略我的 SxS 配置。
提前致谢。
c++ - 如何并排加载同名 DLL (Visual Studio)
我有一个关于side-by-side assemblies
.
情况如下:
我有一个可执行文件,它通过搜索目录app.exe
来加载插件。取决于一定的。plugins
app.exe
A.dll
我正在开发一个插件,该插件依赖于A.dll
具有相同名称的旧定制版本。将这个较旧的定制版本更新到较新版本是不可能的,所以我想我可能能够同时加载这两个A.dll
文件。
这是目录结构:
这两个版本A.dll
本身都依赖于大量其他 DLL,这些 DLL 可能存在类似的版本问题。(我还应该提到我正在使用 64 位应用程序,如果这会有所不同的话。)
如何在 Visual Studio 中进行设置,以便我可以同时加载两个A.dll
库,以便myplugin.dll
使用旧版本,而app.exe
使用新版本?
windows - 无法执行我的程序的 64 位版本
我只是想构建现有程序的 64 位版本(带有一些依赖 DLL 的 EXE)。由于在 Linux 下它很容易(只需重新编译它),我很乐观它在 Windows 下可能会有点相似。不幸的是,它不是...
启动我新编译的 EXE 后,我收到一条错误消息
追查它的原因,我做了一个 SxS 跟踪,显示以下错误消息:
那么这是什么意思?我该如何解决这个问题?为 x64 安装 VS2010-redistributable 包不是诀窍,这里安装程序抱怨已经安装了一个较新的版本......
Manifest 文件中提到了一些 X86 ......是这个原因吗?如果是:我怎样才能找出它仍然依赖于哪些 X(& DLL?
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 进程也以管理员权限开始。
c++ - Visual Studios:应用程序无法启动,因为配置不正确,SxS 错误
我有一个 Visual Studios 2010 项目,它的编译没有任何问题。当我去运行它时,我遇到了:
此应用程序无法启动,因为应用程序配置不正确。
这是昨天早上编译和运行的,但现在它不再运行了。我恢复到原来的版本,但我仍然得到同样的错误。
我跑了 sxstrace,输出是:
我看到有很多对调试 CRT 的引用,但是我将我的项目设置为发布模式,并且我没有链接到任何外部第三方库。
我试图重新安装视觉工作室,但没有奏效。有谁知道出了什么问题?
c# - 在没有代码库/GAC 的情况下将免注册 COM 互操作与 C# .NET DLL 一起使用?
我有一个通过 COM Interop 公开的 C# .NET DLL,为此我生成了一个清单文件。DLL 正在通过 Excel VBAProject 使用CreateActCtx
并CreateObject
创建我的对象。
一切正常,但是……我需要致电regasm MyProject.dll /codebase
或向 GAC 注册。否则我得到ActiveX component can't create object
或error in dll
错误。
是否可以使用 .NET DLL 而无需注册 DLL?我以前可以使用基于 VB6 的 DLL 和清单文件来执行此操作。