是否显示对主可执行文件以外的项目的依赖关系?

标签 manifest side-by-side regfreecom winsxs

我将首先解释我想要做什么(以及为什么),然后再了解更多细节。

我正在尝试在 JIT 编译语言的上下文中激活注册免费 COM。我使用 Reg-Fre COM 是因为我想避免必须注册我的 COM 组件,并且希望无需管理权限即可安装此应用程序。

JIT 编译器是经过签名的主要可执行文件,并包含嵌入的 list 。默认情况下,最新版本的 Windows 更喜欢嵌入 list 而不是外部 list (在 Windows XP 上则相反)。 由于 JIT 已签名,因此我无法在不破坏签名的情况下提取/修改/更新它的 list 。此外,这会增加应用程序维护的复杂性(始终确保我们嵌入新的 list )。修改我不拥有权利的程序也会产生法律影响。

所以,我的想法是尝试通过 Win32 包装器库来激活 WinSxS,我将为其提供一个列出依赖项的 list 。作为概念验证,我决定制作一个简单的 VB6 应用程序、一个 C++ 包装器库和两个 COM 库(1 个在 .NET 中,1 个在 VB6 中)。 该包装器包含 3 个方法,一种调用 VB6 COM,一种调用 .NET COM,一种返回简单字符串。 当然,只要我的 COM 的所有内容都已注册,它就可以工作。 如果我取消注册它们,提供 COM 的 list 并将它们作为依赖项添加到主可执行文件的 list 中,它就可以工作。 如果我取消注册它们,提供 COM 和 C++ 包装器的 list ,并将 com 添加为 C++ 包装器的依赖项,然后将 C++ 包装器添加为主可执行文件 list 中的唯一依赖项,则它可以工作。 如果我删除主可执行文件的 list ,COM 调用将停止工作,但简单的字符串方法仍然有效。

请注意,对于我的所有测试,我运行一个 Powershell 脚本来更改所有文件的修改日期,确保触发激活上下文缓存( list )。

从那里,我开始使用 SXSTrace.exe 进行调试并设置 COMPlus_LoadLogDir 变量。我发现如果我的 list 是外部的,它永远不会被考虑在内。我还发现,如果我将它嵌入到 .DLL 中,sxstrace 会显示它已找到、已解析,并且找到了依赖项、找到了它们的 list ,并且我在日志中获得了通常成功的上下文激活行。

INFO: Parsing Manifest File C:\RegFreeComWrapper\bin\vbCom.MANIFEST.
INFO: Manifest Definition Identity is vbCom,type="win32",version="1.0.0.0".
INFO: Parsing Manifest File C:\RegFreeComWrapper\bin\netCom.MANIFEST.
INFO: Manifest Definition Identity is netCom,processorArchitecture="msil",version="1.0.0.0".
INFO: Activation Context generation succeeded.
End Activation Context Generation.

但是,即使日志这么说,我的 COM 调用仍然无法通过。 当调用进行 .NET COM 调用时,我在 COMPlus_CLRLoadLogDir 配置的路径中获得一些输出。

在这种情况下,我没有得到任何输出。

一旦我添加仅将我的 C++ 包装器列为对我的主可执行文件的依赖项的 list ,一切都会重新开始工作。我从 SXSTrace 得到类似的输出,但现在 COM 调用可以工作。如前所述,在所有情况下,C++ 包装器的简单字符串方法都有效。这意味着即使我没有来自主可执行文件的 list ,它仍然可以找到我的 .dll 并调用它。 如果我没有完整的 list 链,COM 似乎无法工作: Application.Manifest > Wrapper.Manifest > COM list

所以,这里有两件事...... 1.我想做的事情可能吗? (仅在属于我的 DLL 的 list 中列出依赖项,而不触及主可执行文件的 list ) 2.如果可能的话,我可能只是错过了一件小事来让一切顺利进行......它是什么? :)

如果有人有兴趣尝试使用它们,我可以提供我所有的代码/可执行文件作为示例。

最佳答案

成功了!

我修改了 C++ 包装器以使用激活上下文 API 并使用“ActivateActCtx”强制上下文激活

http://msdn.microsoft.com/en-us/library/aa374151(v=vs.85).aspx

我用他们的示例代码包装了我的代码,并确保引用了我的 list ,现在一切正常。我的主要可执行文件上没有 list !

关于是否显示对主可执行文件以外的项目的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19100488/

相关文章:

javascript - 将浏览器 UI 按钮添加到 Firefox WebExtension

java - 正确设置插件后,Maven 无法找到或加载主类

.net - 在应用程序中使用 ‘useLegacyV2RuntimeActivationPolicy’ 和supportedRuntime时出现问题

c# - 在 .NET 应用程序中使用免注册 com

c++ - 在 C++ 组件中使用 Activation Context API

java - 我可以调用位于另一个 jar 文件中的 jar 库中的类文件吗?

google-chrome - 安装我的 chrome 扩展时出现 `Manifest file is invalid`?

.net - 什么是并排装配?

windows - 尝试运行 Matlab-Compiler-Runtime 应用程序时,Windows 7 中出现 SxS 错误

.net - 免注册 COM 互操作和相关程序集