导读:本期聚焦于小伙伴创作的《C#如何实现动态加载程序集并获取相关信息》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何实现动态加载程序集并获取相关信息》有用,将其分享出去将是对创作者最好的鼓励。

在C#的实际开发中,动态加载程序集是一项非常实用的技术,尤其在需要实现插件化架构、热更新功能或者按需加载模块的场景下,掌握这项技术能大幅提升程序的灵活性。下面我们就一步步讲解如何实现动态加载程序集并获取相关信息。

C#如何实现动态加载程序集并获取相关信息

动态加载程序集的基础方法

C#中动态加载程序集主要依靠System.Reflection.Assembly类提供的静态方法,最常用的是LoadFromLoad方法,两者的使用场景有所区别。

LoadFrom方法可以直接传入程序集的文件路径,加载指定路径下的程序集,适合加载本地磁盘上的程序集文件。下面是一个基础的使用示例:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        // 要加载的程序集路径,这里替换为实际的dll路径
        string assemblyPath = @"D:\TestLibrary.dll";
        try
        {
            // 动态加载程序集
            Assembly assembly = Assembly.LoadFrom(assemblyPath);
            Console.WriteLine($"程序集加载成功,名称:{assembly.FullName}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"加载程序集失败:{ex.Message}");
        }
    }
}

如果需要加载已经位于应用程序基目录或者私有bin路径下的程序集,也可以使用Assembly.Load方法,传入程序集的名称即可,不需要完整路径。

获取程序集的基础信息

程序集加载完成后,我们可以通过Assembly实例的属性获取各类基础信息,比如程序集的全名、版本、公钥标记、自定义特性等。

常用的属性包括:

  • FullName:获取程序集的全名,包含名称、版本、文化、公钥标记等信息
  • Location:获取程序集文件的完整路径
  • GetCustomAttributes:获取程序集上定义的所有自定义特性
  • GetTypes:获取程序集内定义的所有类型

下面是通过加载后的程序集获取这些信息的示例代码:

using System;
using System.Reflection;
using System.Linq;

class Program
{
    static void Main()
    {
        string assemblyPath = @"D:\TestLibrary.dll";
        try
        {
            Assembly assembly = Assembly.LoadFrom(assemblyPath);
            // 获取程序集全名
            Console.WriteLine($"程序集全名:{assembly.FullName}");
            // 获取程序集文件路径
            Console.WriteLine($"程序集路径:{assembly.Location}");
            // 获取程序集版本信息
            Version version = assembly.GetName().Version;
            Console.WriteLine($"程序集版本:{version}");
            // 获取程序集内的所有类型
            Type[] types = assembly.GetTypes();
            Console.WriteLine($"程序集包含类型数量:{types.Length}");
            foreach (Type type in types)
            {
                Console.WriteLine($"类型名称:{type.FullName},类型类别:{type.IsClass ? "类" : type.IsInterface ? "接口" : "其他"}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"操作失败:{ex.Message}");
        }
    }
}

获取类型内部信息

除了程序集本身的信息,我们还可以进一步获取程序集内类型的详细信息,包括类型的属性、方法、字段、事件等。

假设我们加载的程序集中有一个名为UserService的类,下面代码演示如何获取这个类的所有公共方法:

using System;
using System.Reflection;
using System.Linq;

class Program
{
    static void Main()
    {
        string assemblyPath = @"D:\TestLibrary.dll";
        try
        {
            Assembly assembly = Assembly.LoadFrom(assemblyPath);
            // 获取指定类型
            Type userServiceType = assembly.GetType("TestLibrary.UserService");
            if (userServiceType == null)
            {
                Console.WriteLine("未找到指定类型");
                return;
            }
            // 获取类型的所有公共方法
            MethodInfo[] methods = userServiceType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
            Console.WriteLine($"UserService类型的公共方法数量:{methods.Length}");
            foreach (MethodInfo method in methods)
            {
                Console.WriteLine($"方法名:{method.Name},返回类型:{method.ReturnType.Name}");
                // 获取方法的参数信息
                ParameterInfo[] parameters = method.GetParameters();
                if (parameters.Length > 0)
                {
                    Console.WriteLine("参数列表:");
                    foreach (ParameterInfo param in parameters)
                    {
                        Console.WriteLine($"  参数名:{param.Name},参数类型:{param.ParameterType.Name}");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"操作失败:{ex.Message}");
        }
    }
}

注意事项

在使用动态加载程序集时,需要注意几个常见问题:

  • 程序集加载后如果没有特殊需求,不会自动卸载,如果需要在运行时卸载程序集,需要将程序集加载到独立的应用程序域中,.NET Core及以上版本可以使用AssemblyLoadContext实现隔离加载和卸载
  • 加载程序集时要做好异常处理,避免因为路径错误、程序集损坏、版本不兼容等问题导致程序崩溃
  • 如果程序集依赖其他程序集,需要确保依赖的程序集可以被正确加载,否则会抛出加载失败的异常

通过上述方法,我们就可以完整实现C#中动态加载程序集并获取相关信息的需求,在实际开发中可以根据具体场景调整获取信息的范围和深度。

C#动态加载程序集Assembly类反射程序集信息修改时间:2026-05-29 14:26:05

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。