应用程序清单和程序集清单之间的差

时间:2010-08-13 10:45:27

标签: windows manifest portable-executable

应用程序清单和程序集清单之间有什么区别?每个人在哪里使用?在.dll或.exe资源中找到了哪两个? (或两者都可以吗?)。

很抱歉,如果它一次出现太多问题,但如果有人能向我解释这个问题,那将非常有帮助。我问这个的原因是我希望能够从嵌入在PE文件中的清单中提取信息。我找到了这些清单的描述,但有两个,我不确定应该遵循哪一个:

Application manifest description
Assembly manifest description

编辑:不,我不想使用任何API调用。我自己写的都是。

3 个答案:

答案 0 :(得分:3)

简而言之,两者是完全不同的概念,不幸的是名字相似。

应用程序清单是嵌入在PE二进制文件(托管或本机)中的XML文件,它向操作系统加载程序提供有关SxS程序集依赖关系,所需高程等内容的说明,OS版本兼容性等。

程序集清单是CLI程序集中的一个部分,说明托管程序集的依赖项,组成程序集的文件,程序集的公钥,类型导出, CLR标志,等等。您可以使用ILDASM.exe或大多数.NET反编译器检查程序集的清单。

ECMA 335(CLI规范)的相关摘录,第I.9.6节:

  

清单:每个程序集都有一个声明哪些文件的清单   弥补装配,导出什么类型,以及其他什么   程序集是解析内部类型引用所必需的   部件。正如CLI组件通过元数据自我描述一样   CLI组件,也就是通过它们自我描述的程序集   体现。当单个文件组成一个程序集时,它包含两个文件   描述程序集中定义的类型的元数据和   描述程序集本身的元数据。当程序集包含时   多个带有元数据的文件,每个文件都描述了   文件中定义的类型(如果有),以及其中一个文件   包含描述程序集的元数据(包括   其他文件,加密哈​​希值以及导出的类型   在集会之外)。

请注意:

  • 所有托管程序集必须具有程序集清单,可执行文件和库等;
  • 所有原生二进制文件,可执行文件和库,可能有应用程序清单。

答案 1 :(得分:0)

似乎我必须遵循两者:

  

作为DLL中的资源,程序集   可供私人使用   DLL。装配清单不能   被包含在EXE中作为资源。   EXE文件可以包括应用程序   表现为资源。

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

答案 2 :(得分:0)

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

程序集清单可以嵌入到DLL中,也可以作为单独的文件存储在磁盘上,并为程序集提供标识和资源列表:是dll,无需激活的com对象和窗口类。

如果程序集的名称是dll的名称,那么相同的清单最终将同时用作确定dll依赖关系的应用程序清单,以及程序集清单以查看程序集导出的内容。对于本机程序集来说,这个选项看起来真的很疯狂,通常最好在company.product.module的行中创建一个具有复杂名称的程序集,然后只需要一个简单的module.dll作为其一个条目。