C#程序集是.NET平台中代码编译后的基本单位,通常以.dll或.exe文件形式存在,包含编译后的中间语言、元数据和资源等内容,是代码复用、模块拆分和部署的核心载体,掌握其使用方法对提升开发效率很有帮助。

程序集的基础概念
程序集可以分为静态程序集和动态程序集两类,静态程序集是提前编译好的文件,动态程序集是在运行时动态生成并存储在内存中的。每个程序集都包含唯一的名称、版本信息、文化信息和公钥标记,这些信息共同构成程序集的完整标识,用于区分不同版本的同名程序集。
静态引用程序集的使用
静态引用是最常用的程序集使用方式,在项目开发阶段就可以完成配置,运行时CLR会自动加载对应的程序集。
添加程序集引用
在Visual Studio中,右键点击项目的引用节点,选择添加引用,在弹出的窗口中可以选择项目引用的其他程序集、NuGet包安装的程序集或者系统自带的程序集,选择完成后点击确定即可完成引用添加。
代码中使用静态引用的程序集
添加引用后,只需要在代码文件顶部使用using指令引入程序集对应的命名空间,就可以直接使用其中定义的类、方法等成员。以下是一个简单的示例,引用自定义的工具类程序集:
// 引入工具类程序集的命名空间
using MyUtils;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
// 直接使用工具类中的方法
string result = StringHelper.FormatName("张三", "李四");
Console.WriteLine(result);
}
}
}
动态加载和使用程序集
当需要在运行时根据条件加载不同的程序集,或者加载非项目预引用的程序集时,就需要使用反射相关的API动态操作程序集。
加载程序集
可以使用Assembly类的静态方法加载程序集,常用的方法有Load、LoadFrom和LoadFile,其中LoadFrom适合加载指定路径的程序集文件。
using System;
using System.Reflection;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
try
{
// 加载指定路径的程序集,注意路径需要是绝对路径或者相对于程序运行目录的路径
Assembly assembly = Assembly.LoadFrom(@"D:libsMyPlugin.dll");
Console.WriteLine($"成功加载程序集:{assembly.FullName}");
}
catch (Exception ex)
{
Console.WriteLine($"加载程序集失败:{ex.Message}");
}
}
}
}
使用动态加载的程序集成员
加载程序集后,可以通过反射获取其中的类型,再创建实例、调用方法。以下示例演示如何调用动态加载程序集中的方法:
using System;
using System.Reflection;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
// 加载程序集
Assembly assembly = Assembly.LoadFrom(@"D:libsMyPlugin.dll");
// 获取程序集中的指定类型,需要写全类型名称(命名空间+类名)
Type pluginType = assembly.GetType("MyPlugin.PluginService");
if (pluginType != null)
{
// 创建类型的实例
object instance = Activator.CreateInstance(pluginType);
// 获取类型中的指定方法
MethodInfo method = pluginType.GetMethod("Execute");
if (method != null)
{
// 调用方法,传入实例和参数
object result = method.Invoke(instance, new object[] { "测试参数" });
Console.WriteLine($"方法执行结果:{result}");
}
}
}
}
}
程序集使用的注意事项
- 动态加载程序集时需要注意路径的正确性,同时处理可能出现的加载失败异常,避免程序崩溃。
- 如果程序集有版本依赖,需要确保依赖的程序集也能被正确加载,否则会出现运行时错误。
- 使用反射调用成员时,需要注意成员的访问权限,私有成员需要设置对应的绑定标志才能访问。
- 对于不再使用的动态加载程序集,如果需要卸载,需要将程序集加载到独立的应用程序域中,因为默认应用程序域中的程序集无法卸载。
常见应用场景
程序集的使用场景非常广泛,比如插件化开发时,主程序可以动态加载不同插件的程序集实现功能扩展;模块化开发时,将不同功能拆分为独立程序集,方便单独更新和维护;还有代码热更新场景中,通过替换程序集文件实现不用重启程序就更新功能。