应用程序清单和程序集清单的区别

3
应用清单和程序集清单有什么区别?它们分别在哪里使用?这两个清单中的哪一个可以在.dll或.exe资源中找到?(或者两者都可以?)很抱歉一次问了这么多问题,但如果有人能向我解释一下,那就太好了。我之所以问这个问题是因为我想从嵌入在PE文件中的清单中提取信息。我找到了这些清单的描述,但有两个,我不确定该遵循哪一个:应用清单描述 程序集清单描述。编辑:不,我不想使用任何API调用。我自己编写所有内容。
3个回答

3
简而言之,这两个概念完全是不同的,只是名字非常相似。
应用程序清单是一个XML文件,嵌入在PE二进制文件(托管或本机)中,或与其一起分发,向操作系统加载器提供关于SxS程序集依赖项、所需提权、操作系统版本兼容性等方面的指令。
程序集清单是CLI程序集中的一个部分,声明托管程序集的依赖项、组成程序集的文件、程序集的公钥、类型导出、CLR标志等。您可以使用ILDASM.exe或大多数.NET反编译器来检查程序集的清单。
以下是ECMA 335(CLI规范)第I.9.6节的相关摘录:
清单:每个程序集都有一个清单,声明了哪些文件构成了程序集,导出了哪些类型,以及解析程序集内类型引用所需的其他程序集。就像CLI组件通过CLI组件中的元数据进行自描述一样,程序集也通过其清单进行自描述。当单个文件构成程序集时,它包含描述程序集中定义的类型和描述程序集本身的元数据。当程序集包含多个具有元数据的文件时,每个文件都描述了该文件中定义的类型(如果有的话),其中一个文件还包含描述程序集的元数据(包括其他文件的名称、它们的加密哈希和它们在程序集外部导出的类型)。
请注意:
所有托管程序集都必须具有程序集清单,无论是可执行文件还是库;
所有本机二进制文件,包括可执行文件和库,都可以具有应用程序清单。

1

应用程序清单通常嵌入在EXE和DLL中,具有讽刺意味的是,它们指定了EXE或DLL所依赖的程序集。

程序集清单可以嵌入在DLL中,也可以作为单独的文件存储在磁盘上,给程序集一个标识和一组资源:包括dll、激活免费的COM对象和窗口类。

如果程序集的名称是dll的名称,则相同的清单最终被用作应用程序清单来确定dll的依赖关系,并且用作程序集清单来查看程序集导出的内容。对于本机程序集来说,这个选项似乎真的很疯狂,通常最好创建一个名称复杂的程序集,例如company.product.module,然后只有一个简单的module.dll作为其条目。


1

看起来我需要同时遵循以下两点:

作为 DLL 中的资源,程序集可供 DLL 私有使用。程序集清单不能作为 EXE 的资源包含在内。EXE 文件可以将应用程序清单作为资源包含在内。

(信息来源这里)。因此,似乎 可执行文件 在资源中嵌入了 应用程序清单,而 (DLL) 则具有 程序集清单。由于它们都是 PE (可移植可执行文件),我需要解析这两种类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接