首页 > 解决方案 > Linux环境下获取dll元数据

问题描述

我希望能够在 Linux 环境中(即在运行任何docker 映像时)获取任何dll(尽可能支持 dotnet 版本)的元数据。mcr.microsoft.com/dotnet/core/sdk

那能实现吗?

通过元数据,我的意思是我可以在不加载代码的情况下讲述的所有内容(最重要的 - 命名空间、版本)。

我观察到Assembly.ReflectionOnlyLoadFrom(),但它似乎不支持 pre-dotnet-core 版本。

我不限于编程语言,仅限于基于 Linux 的运行时。

标签: c#.netdll.net-core.net-assembly

解决方案


使用AssemblyMetadatafrom Microsoft.CodeAnalysis.Commonpackage 您可以读取 dll 的内容,例如版本、模块、类型、参考、属性以及几乎所有内容

var path = @"path/to/dll/file.dll";
var metadata = AssemblyMetadata.CreateFromFile(path);
var module = metadata.GetModules().First();
Console.WriteLine(module.Name);

var reader = module.GetMetadataReader();

var assemblyDef = reader.GetAssemblyDefinition();
Console.WriteLine(reader.GetString(assemblyDef.Name));
Console.WriteLine(assemblyDef.Version.ToString());

foreach (var typeDefHandle in reader.TypeDefinitions)
{
    var typeDef = reader.GetTypeDefinition(typeDefHandle);
    var fullName = (reader.GetString(typeDef.Namespace) + "::" + reader.GetString(typeDef.Name));
    Console.WriteLine(fullName);
}

推荐阅读