从c#中检索程序集的MVID?

Nes*_*tor 7 .net c# reflection

如何使用c#中的反射检索.NET程序集的模块版本标识符(MVID)?

Kei*_*thS 10

应该:

var myAssembly = Assembly.GetExecutingAssembly(); //or whatever
var mvid = myAssembly.ManifestModule.ModuleVersionID;
Run Code Online (Sandbox Code Playgroud)

程序集中可以有其他模块,但ManifestModule将是"标识"程序集本身的模块.


Kir*_*kov 5

这是一个不使用反射加载程序集而是使用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);
}
Run Code Online (Sandbox Code Playgroud)

这是使用Mono.Cecil的示例:

var module = Mono.Cecil.ModuleDefinition.ReadModule(filePath);
var mvid = module.Mvid;
Run Code Online (Sandbox Code Playgroud)

这是一个独立代码的示例,用于读取没有任何依赖项的 MVID。它是单个文件中 Mono.Cecil 的精简版本:https : //github.com/KirillOsenkov/MetadataTools/blob/master/src/PEFile/ImageReader.cs