如何使用C#反射检索.NET程序集的模块版本标识符(MVID)?
var myAssembly = Assembly.GetExecutingAssembly(); //or whatever
var mvid = myAssembly.ManifestModule.ModuleVersionID;
一个程序集中可能会有其他模块,但ManifestModule是“标识”程序集本身的模块。
下面是一个示例,它不使用Reflection来加载程序集,而是使用System.Reflection.Metadata:
using (var stream = File.OpenRead(filePath))
{
PEReader reader = new PEReader(stream);
var metadataReader = reader.GetMetadataReader();
var mvidHandle = metadataReader.GetModuleDefinition().Mvid;
var mvid = metadataReader.GetGuid(mvidHandle);
}
下面是一个使用 Mono.Cecil 的示例:
var module = Mono.Cecil.ModuleDefinition.ReadModule(filePath);
var mvid = module.Mvid;
下面是一个无需依赖项的独立代码示例,可读取MVID。它是Mono.Cecil的精简版本,只有一个文件: https://github.com/KirillOsenkov/MetadataTools/blob/master/src/PEFile/ImageReader.cs