dotnet new classlib -n MyLibrary
或使用 Visual Studio 创建类库项目
MyLibrary/
├── src/ # 主代码
├── tests/ # 单元测试
├── samples/ # 使用示例
└── docs/ # 文档
///
/// 提供数据处理功能
///
public class DataProcessor
{
///
/// 处理输入数据
///
/// 输入字符串
/// 处理后的结果
public string Process(string input)
{
return input.ToUpper();
}
}
dotnet add package Newtonsoft.Json
创建测试项目并添加引用:
dotnet new xunit -n MyLibrary.Tests
dotnet add MyLibrary.Tests reference MyLibrary
编辑.csproj文件,添加必要元数据:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0TargetFramework>
<GeneratePackageOnBuild>trueGeneratePackageOnBuild>
<PackageId>MyCompany.MyLibraryPackageId>
<Version>1.0.0Version>
<Authors>Your NameAuthors>
<Description>A useful library for data processingDescription>
PropertyGroup>
Project>
dotnet build
dotnet pack
可以将依赖打包到单个DLL中:
<PropertyGroup>
<PublishSingleFile>truePublishSingleFile>
<SelfContained>trueSelfContained>
<RuntimeIdentifier>win-x64RuntimeIdentifier>
PropertyGroup>
使用工具如ILMerge或Fody.Costura将所有依赖合并到主DLL中:
dotnet add package Fody
dotnet add package Costura.Fody
<Weavers>
<Costura/>
Weavers>
<TargetFrameworks>netstandard2.0;net6.0;net8.0TargetFrameworks>
<EnableNETAnalyzers>trueEnableNETAnalyzers>
通过遵循这些步骤和注意事项,您可以开发出高质量、可维护且易于使用的.NET类库。
在 .NET 中,将 DLL 及其所有依赖打包成一个独立文件有几种可行方案,以下是详细的实现方法:
这是 .NET Core 3.0+ 和 .NET 5+ 提供的官方解决方案。
<PropertyGroup>
<PublishSingleFile>truePublishSingleFile>
<IncludeAllContentForSelfExtract>trueIncludeAllContentForSelfExtract>
<SelfContained>trueSelfContained>
<RuntimeIdentifier>win-x64RuntimeIdentifier>
<EnableCompressionInSingleFile>trueEnableCompressionInSingleFile>
PropertyGroup>
dotnet publish -c Release -r win-x64 --self-contained true
适用于 .NET Framework 项目。
Install-Package ILMerge -Version 3.0.41
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command=""$(ILMergeConsolePath)" /out:"$(TargetDir)merged\$(TargetName).dll" "$(TargetPath)" "$(TargetDir)*.dll" /targetplatform:v4 /internalize" />
Target>
ILMerge /out:merged.dll MyLibrary.dll Newtonsoft.Json.dll OtherDependency.dll
将依赖 DLL 作为资源嵌入到主 DLL 中。
dotnet add package Fody
dotnet add package Costura.Fody
FodyWeavers.xml
文件:<Weavers>
<Costura
IncludeDebugSymbols="false"
DisableCleanup="false"
DisableCompression="false"
CreateTemporaryAssemblies="true"
IncludeAssemblies="*.dll"
ExcludeAssemblies="System.*;Microsoft.*" />
Weavers>
手动控制程序集加载。
using System.Runtime.Loader;
var resolver = new AssemblyDependencyResolver(Assembly.GetExecutingAssembly().Location);
AssemblyLoadContext.Default.Resolving += (context, assemblyName) =>
{
string assemblyPath = resolver.ResolveAssemblyToPath(assemblyName);
if (assemblyPath != null)
{
return context.LoadFromAssemblyPath(assemblyPath);
}
return null;
};
方案 | 适用框架 | 优点 | 缺点 |
---|---|---|---|
单文件发布 | .NET Core 3.0+ | 官方支持,最稳定 | 生成的是exe不是纯DLL |
ILMerge | .NET Framework | 生成纯DLL | 不兼容.NET Core,可能有问题 |
Fody/Costura | 全框架支持 | 简单易用 | 运行时解压可能有性能开销 |
AssemblyLoadContext | .NET Core+ | 完全控制 | 实现复杂 |
依赖冲突:
Aliases
解决同名程序集问题extern alias
强名称问题:
-keyfile
参数指定密钥性能问题:
选择哪种方案取决于您的具体需求、目标框架和部署环境。