什么是程序集,程序集举例

在 .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.dllMyApp.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 应用程序中的多种用途:
  1. 代码组织:将代码封装到类库中,便于复用。
  2. 动态加载:通过反射动态加载和使用程序集。
  3. 嵌入资源:将资源文件嵌入到程序集中,便于分发。
  4. 版本控制:为程序集添加版本信息,便于管理和更新。
这些功能使得程序集成为 .NET 开发中不可或缺的一部分。
posted @ 2025-07-30 16:39  yinghualeihenmei  阅读(15)  评论(0)    收藏  举报