清单的主体可执行文件以外的项目的依赖项?
我会解释我想要做什么(以及为什么),然后进一步了解细节。清单的主体可执行文件以外的项目的依赖项?
我正试图获得注册免费COM激活工作在编译JIT语言的上下文中。我使用Reg-Fre COM,因为我想避免必须注册我的COM组件,并希望此应用程序可以在没有管理权限的情况下安装。
JIT编译器是主要的可执行文件被签名并包含嵌入式清单。默认情况下,Windows的最新版本更喜欢外部的嵌入式清单(在Windows XP上相反)。 由于JIT已签名,因此我无法在不中断签名的情况下提取/修改/更新其清单。此外,这会在维护我们的应用程序时带来复杂性(始终确保我们嵌入了新的清单)。还有修改我不拥有权利的程序的法律含义。
所以,我的想法是试图让WinSxS激活通过一个Win32包装库,我将提供一个列出依赖关系的清单。作为一个概念证明,我决定制作一个简单的VB6应用程序,一个C++ Wrapper库和两个COM库(1个.NET和1个VB6)。 包装包含3个方法,一个调用VB6 COM,一个调用.NET COM,另一个返回简单的字符串。 只要作为我的COM的所有东西都被注册了,当然就可以工作。 如果我取消注册它们,为COM提供清单并将它们作为依赖关系添加到主可执行文件的清单中,它就可以工作。 如果我注销它们,为COM和C++ Wrapper提供清单,并添加com作为C++ Wrapper的依赖项,然后将C++ Wrapper作为主可执行文件清单中的唯一依赖项添加它。 如果我删除我的主要可执行文件的清单,COM调用停止工作,但简单的字符串方法仍然有效。
请注意,对于我所有的测试,我运行一个Powershell脚本来更改我的所有文件的修改日期,确保激活上下文缓存(清单)。
从那里,我开始使用SXSTrace.exe进行调试并设置COMPlus_LoadLogDir变量。我发现,如果我的清单是外部的,它从来没有被考虑到。我还发现,如果我将它嵌入到.DLL中,sxstrace显示它被发现,解析并找到依赖关系,找到它们的清单,并在日志中获得通常成功的上下文激活行。
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++包装作为依赖到我的主要可执行文件,一切都开始工作了。我从SXSTrace获得类似的输出,但是现在COM调用起作用。如前所述,在所有情况下,C++ Wrapper的简单字符串方法都可以工作。意思是即使我没有从我的主要可执行文件清单,它仍然可以找到我的.dll并调用它。 好像是在COMS如果我没有完整的清单链不起作用: Application.Manifest> Wrapper.Manifest> COM模块体现
所以,在这里两件事情...... 1的是我的事试图做到甚至可能?(只有在属于我的DLL的清单中列出了依赖关系,而没有触及主可执行文件的清单) 2.如果可能,我可能只是错过了一件小事让所有事情都发生......它是什么? :)
我可以提供我所有的代码/可执行文件作为示例,如果有人有兴趣尝试使用em的东西。
明白了!
我修改了我的C++包装使用激活上下文API并强制使用上下文激活“ActivateActCtx”
http://msdn.microsoft.com/en-us/library/aa374151(v=vs.85).aspx
我包裹着我与他们的例子代码代码,并确保引用我的清单和现在一切工作正常。我的主要可执行文件没有清单!