什么是程序集,程序集举例
在 .NET 中,程序集(Assembly) 是应用程序的基本构建块,它包含代码、资源和元数据。程序集是 .NET 应用程序的最小部署单元,用于组织和分发代码和资源。
示例 1:创建一个简单的程序集
假设我们有一个简单的 C# 项目,包含一个类库(DLL)和一个控制台应用程序(EXE)。我们将通过这个示例展示如何创建程序集、加载程序集以及使用反射。
1. 创建类库项目
首先,创建一个类库项目
MyLibrary
,包含一个简单的类 MyClass
。MyLibrary.csproj
xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<AssemblyName>MyLibrary</AssemblyName>
<RootNamespace>MyLibrary</RootNamespace>
</PropertyGroup>
</Project>
MyClass.cs
csharp
namespace MyLibrary
{
public class MyClass
{
public string GetMessage()
{
return "Hello from MyClass!";
}
}
}
2. 创建控制台应用程序
接下来,创建一个控制台应用程序
MyApp
,它将引用 MyLibrary
并使用其中的 MyClass
。MyApp.csproj
xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\MyLibrary\MyLibrary.csproj" />
</ItemGroup>
</Project>
Program.cs
csharp
using System;
using MyLibrary;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
Console.WriteLine(myClass.GetMessage());
}
}
}
3. 编译和运行
编译项目后,
MyLibrary.dll
和 MyApp.exe
将被生成。运行 MyApp.exe
,输出如下:Hello from MyClass!
示例 2:使用反射加载程序集
假设我们想在运行时动态加载
MyLibrary.dll
并调用其中的 MyClass
的方法。1. 创建一个控制台应用程序
创建一个新的控制台应用程序
DynamicApp
,不直接引用 MyLibrary
,而是通过反射加载它。DynamicApp.csproj
xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
</Project>
Program.cs
csharp
using System;
using System.Reflection;
namespace DynamicApp
{
class Program
{
static void Main(string[] args)
{
// 加载程序集
Assembly assembly = Assembly.LoadFrom("path/to/MyLibrary.dll");
// 获取类型
Type myClassType = assembly.GetType("MyLibrary.MyClass");
// 创建实例
object myClassInstance = Activator.CreateInstance(myClassType);
// 调用方法
MethodInfo methodInfo = myClassType.GetMethod("GetMessage");
string result = (string)methodInfo.Invoke(myClassInstance, null);
Console.WriteLine(result);
}
}
}
2. 运行程序
将
MyLibrary.dll
放在程序的工作目录中,运行 DynamicApp.exe
,输出如下:Hello from MyClass!
示例 3:嵌入资源到程序集
假设我们想将一个文本文件
example.txt
嵌入到 MyLibrary.dll
中,并在运行时加载它。1. 修改类库项目
在
MyLibrary
项目中,将 example.txt
添加为嵌入资源。example.txt
This is an embedded resource.
MyLibrary.csproj
xml
<ItemGroup>
<EmbeddedResource Include="example.txt" />
</ItemGroup>
2. 修改控制台应用程序
在
MyApp
中,加载嵌入的资源文件。Program.cs
csharp
using System;
using System.IO;
using System.Reflection;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
// 获取入口程序集
Assembly entryAssembly = Assembly.GetEntryAssembly();
// 获取嵌入资源的名称
string resourceName = "MyLibrary.example.txt";
// 加载嵌入资源
using (Stream stream = entryAssembly.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
string content = reader.ReadToEnd();
Console.WriteLine("嵌入资源的内容:");
Console.WriteLine(content);
}
}
}
}
}
3. 运行程序
运行
MyApp.exe
,输出如下:嵌入资源的内容:
This is an embedded resource.
示例 4:程序集的版本控制
假设我们想为
MyLibrary
添加版本控制。1. 修改类库项目
在
MyLibrary
项目中,添加版本信息。MyLibrary.csproj
xml
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<AssemblyName>MyLibrary</AssemblyName>
<RootNamespace>MyLibrary</RootNamespace>
<Version>1.0.0.0</Version>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion>
</PropertyGroup>
2. 检查版本信息
在
MyApp
中,检查 MyLibrary
的版本信息。Program.cs
csharp
using System;
using System.Reflection;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
// 获取 MyLibrary 程序集
Assembly myLibraryAssembly = typeof(MyLibrary.MyClass).Assembly;
// 获取版本信息
Version assemblyVersion = myLibraryAssembly.GetName().Version;
Version fileVersion = FileVersionInfo.GetVersionInfo(myLibraryAssembly.Location).FileVersion;
Console.WriteLine($"程序集版本: {assemblyVersion}");
Console.WriteLine($"文件版本: {fileVersion}");
}
}
}
3. 运行程序
运行
MyApp.exe
,输出如下:程序集版本: 1.0.0.0
文件版本: 1.0.0.0
总结
通过这些示例,你可以看到程序集在 .NET 应用程序中的多种用途:
-
代码组织:将代码封装到类库中,便于复用。
-
动态加载:通过反射动态加载和使用程序集。
-
嵌入资源:将资源文件嵌入到程序集中,便于分发。
-
版本控制:为程序集添加版本信息,便于管理和更新。
这些功能使得程序集成为 .NET 开发中不可或缺的一部分。