首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将程序集清单直接加载到应用程序上下文中是否正确?

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

Stack Overflow用户
提问于 2013-10-15 12:32:53
回答 1查看 2.4K关注 0票数 3

我目前正试图得到一个相当混乱的方案运行与注册免费的COM。

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

示例项目MS本身发布很容易解释

通常,您有一个应用程序、一个应用程序清单、一个(服务器-)dll及其程序清单。这些都对应于什么实例给出

  • client.exe
  • client.exe.manifest (这一个指向SideBySide.X作为dependentAssembly)
  • SideBySide.dll
  • SideBySide.X.manifest

现在,一种标准情况是将客户端应用程序清单嵌入到客户端可执行文件中,然后使用DLL及其外部清单文件。

现在,如果由于任何原因,在编译时不知道正确的应用程序清单,则可以通过激活上下文API在运行时加载清单文件。

这就是让人困惑的地方:

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

如果你看看_tmain函数在client.cpp中..。初始化激活上下文的新代码部分如下: actCtx.lpSource = "SideBySide.X.manifest";

我已经交叉检查过它,它还可以动态加载包含来自client.exe.manifest的信息的文件,即对SideBySide.X的引用,并继续使用这个激活上下文--当我们将正确的应用程序清单嵌入到可执行文件中时,这个上下文也会对应于使用中的ActCtx。

也就是说,actCtx.lpSource = "client.exe.manifest";也能工作。

TL;DR --如果有的话,直接激活“包含”应用程序代码中的程序集清单的激活上下文意味着什么。

从文件加载清单时应该这样做吗?(如果是这样的话,为什么我们不能直接将程序集清单嵌入到可执行文件中,因为它在编译时就知道了。)

Note:(这应该是对@Eric的回答的一个评论,但它变得相当冗长)

链接物品在解释这两种RT_MANIFEST资源类型方面做得不错,但是对于regFreeCOm,它留下了一些不确定的地方。我要加几句引语给我听:

ISOLATIONAWARE_MANIFEST_RESOURCE_ID主要用于DLL。如果dll需要进程默认值以外的私有依赖项,则应使用它。..。NT库加载程序检查dll是否具有RT_MANIFEST类型的ID ISOLATIONAWARE_MANIFEST_RESOURCE_ID资源,如果有,加载程序将使用该资源调用CreateActCtx,并使用生成的激活上下文来探测的静态依赖项

我理解这意味着,RT_MANIFEST/2的唯一要点是让静态DLL依赖程序找到用于解决DLL依赖关系的正确资源。(不是COM依赖项,请参见下面。)

有时,您希望在探测dll的静态依赖项之外使用激活上下文。您可以在编译模块时定义宏ISOLATION_AWARE_ENABLED。 当定义ISOLATION_AWARE_ENABLED时,Windows重新定义某些API.例如,LoadLibraryExW被重新定义为IsolationAwareLoadLibraryExW。 ..。并不是所有受激活上下文影响的API都被包装。例如,.和都不是COM API

因此,总而言之:我认为RT_MANIFEST机制大部分与regFreeCOM是正交的,因为COM根本不关心它的激活上下文来自哪里,也没有内置的regFreeCOM wrt帮助。隔离意识。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-15 16:37:56

是的,应该这样做,您可以将程序集清单嵌入到可执行文件(嗯,资源部分)中。这就是舱单资源类型的用途。有两种默认类型的清单资源

  • 进程清单,使用ID CREATEPROCESS_MANIFEST_RESOURCE_ID (1),在进程创建期间使用,
  • 在动态链接库加载期间,使用ID ISOLATIONAWARE_MANIFEST_RESOURCE_ID (2)来识别隔离清单.

有几个用途(主要围绕单击一次部署)说明了使用RT_MANIFEST在辅助DLL中嵌入无注册COM清单的能力。特别是,如果DLL有一个CREATEPROCESS_MANIFEST_RESOURCE_ID,那么这个清单也将被使用。

在这里,一个例子似乎是件好事。

给定的

  • client.exe
  • sidebyside.dll

如果sidebyside.dll有一个ID 1 (CREATEPROCESS_MANIFEST_RESOURCE_ID)的RT_MANIFEST资源,其中有适当的免费注册COM条目,而client.exe有一个ID 1的RT_MANIFEST资源,其中有sidebyside.dll的<file>条目,那么Win32将自动处理无注册的COM管理。

示例文章的第8部分强烈地暗示了这一点,我已经在许多内部项目中看到了这一点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19381348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档