首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用System.Reflection.Metadata查找实现特定接口的所有类

如何使用System.Reflection.Metadata查找实现特定接口的所有类
EN

Stack Overflow用户
提问于 2022-11-17 17:50:41
回答 1查看 33关注 0票数 1

我试图弄清楚是否能够可靠地识别包含实现特定接口的类的.NET程序集。这里的问题是,我不能使用反射加载程序集,因为这需要解析要加载的程序集的所有引用,在我的情况下这是不可能的。

这就是为什么我试图使用NuGet包System.Reflection.Metadata来这样做的原因,因为这种方法似乎不需要加载引用的程序集。但是,我不得不完成代码,以便找到所讨论的接口。我现在拥有的是:

代码语言:javascript
复制
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解析为完全限定名的实际类型,以便将其与我要寻找的接口的类型/名称进行比较?

EN

回答 1

Stack Overflow用户

发布于 2022-11-17 18:13:04

好的,经过更多的尝试和错误之后,我可以找到程序集实现中的所有类的完全限定名:

代码语言:javascript
复制
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;
            }
         }
      }
   }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74479958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档