程序集(Assembly)是 .NET 平台中的一个重要概念,它是代码和资源的逻辑单元,也是应用程序的部署、版本控制和安全权限的最小单位。下面详细介绍其定义和常见用法:
1. 程序集的定义
程序集是 .NET 应用程序的构建块,通常表现为 DLL(动态链接库)或 EXE(可执行文件)文件。它包含以下内容:
- IL 代码:中间语言(Intermediate Language),是 .NET 代码编译后的中间形式,需要 JIT(即时编译)转换为机器码。
- 元数据:描述程序集中类型、成员、引用关系等信息的数据。
- 资源文件:图标、图像、字符串等非代码资源。
- 清单:程序集的元数据,包括版本号、依赖项、标识信息等。
2. 程序集的主要用法
(1)模块化开发
程序集允许将代码分割为独立的功能模块,便于团队协作和代码复用。例如:
// MathLibrary.dll
public class Calculator {
public static int Add(int a, int b) => a + b;
}
// MainApp.exe
var result = Calculator.Add(1, 2); // 引用 MathLibrary.dll
(2)版本控制
程序集通过 AssemblyVersion 特性实现版本管理,格式为 主版本.次版本.构建号.修订号
(如 1.0.0.0
)。这有助于解决 DLL 地狱问题:
[assembly: AssemblyVersion("1.0.0.0")]
(3)运行时加载
程序集可以在运行时动态加载(如插件系统),使用 Assembly.Load
方法:
Assembly pluginAssembly = Assembly.LoadFrom("Plugin.dll");
Type pluginType = pluginAssembly.GetType("MyPlugin.MyClass");
(4)资源管理
程序集可以包含嵌入式资源(如图片、配置文件),通过 ResourceManager
访问:
// 嵌入资源:Resources/logo.png
var resourceManager = new ResourceManager("MyApp.Resources", this.GetType().Assembly);
var logo = resourceManager.GetObject("logo");
(5)安全权限
程序集可以基于其来源(如 Internet、本地硬盘)授予不同的安全权限,通过 Evidence 对象实现。
(6)多语言互操作性
不同 .NET 语言(C#、VB.NET、F#)编译的程序集可以互相引用,因为它们共享相同的 IL 和运行时。
3. 程序集的分类
- 私有程序集:随应用程序部署,仅供单个应用使用。
- 共享程序集:安装在全局程序集缓存(GAC)中,多个应用共享。
- 卫星程序集:专门用于存储本地化资源的程序集。
4. 常用工具
- ILDASM:查看程序集的 IL 代码和元数据。
- GACUTIL:管理全局程序集缓存。
- Assembly Binding Log Viewer:诊断程序集加载问题。
示例:创建和引用程序集
(1)创建类库(ClassLibrary.dll)
// ClassLibrary/MyClass.cs
namespace ClassLibrary {
public class MyClass {
public static string GetMessage() => "Hello from ClassLibrary!";
}
}
(2)在应用程序中引用
// Program.cs
using ClassLibrary;
var message = MyClass.GetMessage();
Console.WriteLine(message); // 输出:Hello from ClassLibrary!
总结
程序集是 .NET 平台的核心机制,提供了代码组织、版本控制、资源管理和安全隔离的能力,是构建大型应用和组件化系统的基础。