【问题标题】:How to get the names of all classes that implements a specific interface from a dll如何从dll中获取实现特定接口的所有类的名称
【发布时间】:2020-10-25 15:25:09
【问题描述】:

如何从 dll 中获取实现特定接口的所有类的名称。我正在尝试将旧版 .Net Windows Form 应用程序移植到 Blazor Server 应用程序,并且遇到了旧代码不再工作的问题。谁能解释这是如何实现的?下面是抛出异常“无法加载文件或程序集'XXX,Version = 1.0.0.0,Culture = Neutral,PublicKeyToken = null'的旧代码。系统找不到指定的文件。”

    class AssemblyLoader : MarshalByRefObject
    {
         public AssemblyLoader()
         { }

         public List<string> Load(string AssemblyFilePath)
         {
            var SelectedAssembly = System.Reflection.Assembly.LoadFrom(AssemblyFilePath);

            var Types = GetTypesSafely(SelectedAssembly);

            var FilteredTypes = Types.Where(x => x.GetInterface("ITestNode") != null && !x.IsAbstract);

            List<string> TestNodes = new List<string>();

            foreach (Type FilteredType in FilteredTypes)
            {
                TestNodes.Add(FilteredType.FullName);
            }

            return TestNodes;
        }

        private IEnumerable<Type> GetTypesSafely(Assembly SelectedAssembly)
        {
           try
           {
            return SelectedAssembly.GetTypes();
           }
           catch (ReflectionTypeLoadException ex)
           {
            return ex.Types.Where(x => x != null);
           }
       }
    }


    main()
    {
        AppDomainSetup DomainSetup = new AppDomainSetup();
        DomainSetup.ShadowCopyFiles = "true";

        var Domain = AppDomain.CreateDomain("loader", null, DomainSetup);

        var Handle = Domain.CreateInstanceFrom(Assembly.GetExecutingAssembly().Location, typeof(AssemblyLoader).FullName);

        AssemblyLoader Loader = Handle.Unwrap() as AssemblyLoader;

        var Types = Loader.Load(@"C:\MyAssembly.dll");

        AppDomain.Unload(Domain);

        return Types;
    }

【问题讨论】:

  • 试试Assembly.LoadFile("path_to_DLL").GetTypes().Where(t =&gt; typeof(IFoo).IsAssignableFrom(t))
  • @Enigmativity 这给了我异常“无法加载文件或程序集'XXX,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null'。系统找不到指定的文件。”。需要指出的一点是,我要加载的库是 .net framework 4.6
  • 有人愿意解释否决票吗?
  • 继续尝试Assembly.Load* 方法。他们应该做你需要的。

标签: .net .net-core reflection blazor-server-side


【解决方案1】:

我使用的两种方式。

  1. 使用 Visual Studio - 假设您的代码可以在 Visual Studio 2019+ 中加载并且当前可以编译(如果没有,您可能需要定位包)。转到界面,右键单击并“转到实现”

  2. 使用 NotePad++ 或其他具有良好“搜索文件”功能的文本编辑 选择在文件中查找,定位到你的src目录并搜索接口 在 2 次独立搜索中使用 : IYourInterface, IYourInterface

选项 1 是最好和最简单的,但我通常需要使用数字 2,因为并非所有源项目都显示在 Visual Studio 解决方案中,因此不会在搜索结果中找到。

【讨论】:

  • 抱歉不清楚,我在服务器运行时需要这些信息。我已经更新了我的问题。
猜你喜欢
  • 2013-01-15
  • 2013-12-24
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
相关资源
最近更新 更多