我将首先解释我想要做什么(以及为什么),然后再了解更多细节。
我正在尝试在 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/