Winapi 直接将程序集清单加载到应用程序上下文中是否正确?
我目前正试图让一个相当复杂的方案运行免费注册的COM 这并不是说它不起作用,而是我遇到了一种令人困惑的情况,似乎我应该直接在应用程序上下文中激活程序集依赖项的清单,而不是让应用程序上下文指向依赖程序集 这很容易通过以下方式进行解释: 通常,您有一个应用程序、一个应用程序清单、一个(服务器)dll及其程序集清单。这些对应于:Winapi 直接将程序集清单加载到应用程序上下文中是否正确?,winapi,visual-c++,side-by-side,regfreecom,activation-context-api,Winapi,Visual C++,Side By Side,Regfreecom,Activation Context Api,我目前正试图让一个相当复杂的方案运行免费注册的COM 这并不是说它不起作用,而是我遇到了一种令人困惑的情况,似乎我应该直接在应用程序上下文中激活程序集依赖项的清单,而不是让应用程序上下文指向依赖程序集 这很容易通过以下方式进行解释: 通常,您有一个应用程序、一个应用程序清单、一个(服务器)dll及其程序集清单。这些对应于: client.exe client.exe.manifest(这一个指向SideBySide.X作为dependentAssembly) SideBySide.dll Si
- client.exe
- client.exe.manifest(这一个指向SideBySide.X作为
)dependentAssembly
- SideBySide.dll
- SideBySide.X.manifest
actCtx.lpSource = "SideBySide.X.manifest";
我已经对此进行了交叉检查,它还可以动态加载一个文件,其中包含来自client.exe.manifest
的信息,即对SideBySide.X的引用,并继续此激活上下文-当我们将正确的应用程序清单嵌入到可执行文件中时,它还将对应于使用中的ActCtx
即,actCtx.lpSource=“client.exe.manifest”代码>也可以
TL;DR直接激活激活上下文“包含”应用程序代码内的程序集清单的含义是什么(如果有)
从文件加载清单时,应该这样做吗?(如果是这样,为什么我们不能直接将程序集清单嵌入到可执行文件中,而编译时它是已知的。)
注意:(这应该是对@Eric Brown的回答的评论,但它变得相当冗长)
在解释两种RT\u清单
资源类型方面做得不错,但是对于regFreeCOm,它留下了一些松散的结尾。我会引用一些让我吃惊的话:
ISOLATIONAWARE_MANIFEST_RESOURCE_ID主要用于DLL。信息技术
如果dll需要私有依赖项而不是
处理默认值。。。
NT库加载器检查
dll具有类型为RT_清单ID的资源
ISOLATIONAWARE_MANIFEST_RESOURCE_ID。如果是,加载程序将调用
使用资源创建actctx,并使用生成的激活
上下文来探测dll的静态依赖项
我理解这意味着,RT\u MANIFEST/2
的唯一要点是静态DLL依赖项加载程序找到用于解析DLL依赖项的正确资源。(不是COM依赖项,请参见下文。)
有时,您希望在探测之外使用激活上下文
dll的静态依赖项。您可以定义宏
编译模块时启用隔离感知功能
定义了隔离\u-AWARE\u-ENABLED后,Windows会重新定义某些
API。例如,LoadLibraryExW被重新定义为
隔离A重新加载库EXW
。。。并非所有受激活上下文影响的API都被包装。例如
…和任何COM API都不是
总之,我认为RT_清单机制与regFreeCOM基本上是正交的,因为COM根本不关心它的激活上下文来自何处,而且regFreeCOM wrt没有内置的帮助。隔离意识。是的,应该这样做,您可以将程序集清单嵌入到可执行文件中(好的,在参考资料部分)。这就是资源类型的用途。有
- 流程清单,在流程创建期间使用
ID CREATEPROCESS\u MANIFEST\u RESOURCE\u ID
(1)
- 隔离感知清单,具有
ID ISOLATIONAWARE\u MANIFEST\u RESOURCE\u ID
(2),在DLL加载期间使用李>
有两个用途(主要围绕单击一次部署)说明了使用RT_清单在附属DLL中嵌入免注册COM清单的能力。特别是,如果DLL具有CREATEPROCESS_MANIFEST_RESOURCE_ID,则也将使用该清单
在这里举个例子似乎是件好事
给定
- client.exe
- sidebyside.dll
如果sidebyside.dll有一个ID为1的RT_清单资源(CREATEPROCESS_MANIFEST_resource_ID),其中包含适当的免注册COM项,并且client.exe有一个ID为1的RT_清单资源,其中包含sidebyside.dll的
项,则Win32将自动处理免注册COM管理
强烈地暗示了这一点,我在许多内部项目中都看到过它。“…您可以将程序集清单嵌入到可执行文件中…”-是的,我可以嵌入它,但据我所知,它不会用于。请参阅我在q中的相当长的注释。它试图用太多的字眼来表达的是:你在“是的,这就是应该怎么做”之后所写的一切似乎都不适用于regFreeCOM:-)-你的回答非常有用,因为它让我再次以正确的重点重读了这篇文章,如果你能详细说明“是的,这就是应该怎么做的”;-)@MartinBa看到非常长的更新来回答。我希望这足够详细。我要注意一件事:当我在VS2005中创建一个DLL prj时,CRT库的清单将自动嵌入到DLL中。(通过m隐式地