Winapi 直接将程序集清单加载到应用程序上下文中是否正确?

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

我目前正试图让一个相当复杂的方案运行免费注册的COM

这并不是说它不起作用,而是我遇到了一种令人困惑的情况,似乎我应该直接在应用程序上下文中激活程序集依赖项的清单,而不是让应用程序上下文指向依赖程序集

这很容易通过以下方式进行解释:

通常,您有一个应用程序、一个应用程序清单、一个(服务器)dll及其程序集清单。这些对应于:

  • client.exe
  • client.exe.manifest(这一个指向SideBySide.X作为
    dependentAssembly
  • SideBySide.dll
  • SideBySide.X.manifest
现在,一种标准情况是将客户机应用程序清单嵌入到客户机可执行文件中,然后使用DLL及其外部清单文件

现在,如果出于任何原因,在编译时不知道正确的应用程序清单,您可以在运行时通过

这就是让人困惑的地方:

根据本文,客户端应用程序现在直接将其激活上下文切换到程序集清单:

如果您查看client.cpp中的_tmain函数。。。新的代码段初始化激活上下文,如下所示:

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隐式地