我试图弄清楚是否能够可靠地识别包含实现特定接口的类的.NET程序集。这里的问题是,我不能使用反射加载程序集,因为这需要解析要加载的程序集的所有引用,在我的情况下这是不可能的。
这就是为什么我试图使用NuGet包System.Reflection.Metadata来这样做的原因,因为这种方法似乎不需要加载引用的程序集。但是,我不得不完成代码,以便找到所讨论的接口。我现在拥有的是:
namespace ReflectionMetadataTest
{
using System;
using System.IO;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
public static class Program
{
static int Main(string[] args)
{
if (args.Length < 1)
{
Console.Error.WriteLine("Please specify a single file path.");
return 1;
}
string filePath = new FileInfo(args[0]).FullName;
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var peReader = new PEReader(fileStream))
{
if (!peReader.HasMetadata)
{
return 2;
}
MetadataReader metadataReader = peReader.GetMetadataReader();
foreach (var typeDefinitionHandle in metadataReader.TypeDefinitions)
{
var typeDefinition = metadataReader.GetTypeDefinition(typeDefinitionHandle);
var interfaceHandles = typeDefinition.GetInterfaceImplementations();
foreach (var interfaceHandle in interfaceHandles)
{
var interfaceImplementation = metadataReader.GetInterfaceImplementation(interfaceHandle);
var whateverThatIs = interfaceImplementation.Interface;
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// TODO: How would I find the fully qualified name of the the interface so that I can compare with the name I'm looking for?
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
}
return 0;
}
}
}
}
}如何将whateverThatIs解析为完全限定名的实际类型,以便将其与我要寻找的接口的类型/名称进行比较?
发布于 2022-11-17 18:13:04
好的,经过更多的尝试和错误之后,我可以找到程序集实现中的所有类的完全限定名:
namespace ReflectionMetadataTest
{
using System;
using System.IO;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
public static class Program
{
static int Main(string[] args)
{
if (args.Length < 1)
{
Console.Error.WriteLine("Please specify a single file path.");
return 1;
}
string filePath = new FileInfo(args[0]).FullName;
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var peReader = new PEReader(fileStream))
{
if (!peReader.HasMetadata)
{
return 2;
}
MetadataReader metadataReader = peReader.GetMetadataReader();
Console.WriteLine($"The file \"{filePath}\" {(metadataReader.IsAssembly ? "*is*" : "is *not*")} an assembly.");
foreach (var typeDefinitionHandle in metadataReader.TypeDefinitions)
{
var typeDefinition = metadataReader.GetTypeDefinition(typeDefinitionHandle);
var typeName = metadataReader.GetString(typeDefinition.Name);
Console.WriteLine(typeName);
var interfaceHandles = typeDefinition.GetInterfaceImplementations();
foreach (var interfaceHandle in interfaceHandles)
{
var interfaceImplementation = metadataReader.GetInterfaceImplementation(interfaceHandle);
var interfaceType = interfaceImplementation.Interface;
if (interfaceType.Kind == HandleKind.TypeReference)
{
var typeReferenceHandle = (TypeReferenceHandle)interfaceType;
var typeReference = metadataReader.GetTypeReference(typeReferenceHandle);
var namespaceName = metadataReader.GetString(typeReference.Namespace);
var interfaceName = metadataReader.GetString(typeReference.Name);
Console.WriteLine($" Interface Name: {namespaceName}.{interfaceName}");
}
}
}
return 0;
}
}
}
}
}https://stackoverflow.com/questions/74479958
复制相似问题