跳转到内容

下面我们简单介绍一些 C# 语言常用的工程例子。

关于 C# 目标配置的详细说明,请参阅配置目标项目目标 API

控制台应用

EXPLORER
src
Program.cs
xmake.lua
Lua xmake.lua
12345
add_rules("mode.debug", "mode.release")

target("hello")
    set_kind("binary")
    add_files("src/*.cs")

共享库

EXPLORER
src
app
Program.cs
lib
MyLib.cs
xmake.lua
Lua xmake.lua
12345678910
add_rules("mode.debug", "mode.release")

target("mylib")
    set_kind("shared")
    add_files("src/lib/*.cs")

target("app")
    set_kind("binary")
    add_deps("mylib")
    add_files("src/app/*.cs")

通过 add_deps 将一个 C# 共享库自动链接到可执行程序。

NuGet 包集成

EXPLORER
src
Program.cs
xmake.lua
Lua xmake.lua
12345678
add_requires("nuget::Humanizer.Core 2.14.1")

add_rules("mode.debug", "mode.release")

target("app")
    set_kind("binary")
    add_files("src/*.cs")
    add_packages("nuget::Humanizer.Core")

通过 add_requires("nuget::xxx") 集成 NuGet 包,使用方式与 C/C++ 包一致。

C# 与 C/C++ 互操作 (P/Invoke)

EXPLORER
src
app
Program.cs
native
mathlib.c
xmake.lua
Lua xmake.lua
12345678910
add_rules("mode.debug", "mode.release")

target("mathlib")
    set_kind("shared")
    add_files("src/native/*.c")

target("app")
    set_kind("binary")
    add_deps("mathlib")
    add_files("src/app/*.cs")

xmake 支持 C# 通过 P/Invoke 调用 C/C++ 原生库,并自动处理原生共享库的搜索路径(PATH/LD_LIBRARY_PATH/DYLD_LIBRARY_PATH),无需手动配置。

ASP.NET Core Web 项目

通过 csharp.sdk 设置 SDK 类型即可构建 ASP.NET Core Web 项目:

lua
target("webapp")
    set_kind("binary")
    add_values("csharp.sdk", "Microsoft.NET.Sdk.Web")
    add_files("src/Program.cs")

配置选项

C# 规则支持通过 set_values() 配置丰富的 .NET 项目属性,这些值会直接映射到 .csproj 文件中的对应属性。

lua
target("app")
    set_kind("binary")
    add_files("src/*.cs")
    set_values("csharp.target_framework", "net8.0")
    set_values("csharp.lang_version", "12")
    set_values("csharp.nullable", "enable")
    set_values("csharp.allow_unsafe_blocks", true)
    set_values("csharp.publish_single_file", true)
    set_values("csharp.publish_trimmed", true)

完整配置列表

项目

配置名.csproj 属性说明
csharp.sdkProject Sdk项目 SDK 类型,默认 Microsoft.NET.Sdk,Web 项目设为 Microsoft.NET.Sdk.Web

常规

配置名.csproj 属性说明
csharp.target_frameworkTargetFramework目标框架,如 net8.0,未设置时从 dotnet sdk 自动检测
csharp.target_frameworksTargetFrameworks多目标框架,如 {"net8.0", "net9.0"},分号拼接
csharp.implicit_usingsImplicitUsings隐式 using,默认 enable
csharp.nullableNullable可空引用类型,默认 enable
csharp.lang_versionLangVersion语言版本,如 12.0latest
csharp.root_namespaceRootNamespace根命名空间
csharp.enable_default_compile_itemsEnableDefaultCompileItems启用默认编译项,默认 false
csharp.enable_default_embedded_resource_itemsEnableDefaultEmbeddedResourceItems启用默认嵌入资源项
csharp.enable_default_none_itemsEnableDefaultNoneItems启用默认 None 项

构建

配置名.csproj 属性说明
csharp.generate_assembly_infoGenerateAssemblyInfo生成程序集信息
csharp.deterministicDeterministic确定性构建
csharp.prefer_32bitPrefer32Bit优先 32 位
csharp.allow_unsafe_blocksAllowUnsafeBlocks允许不安全代码块
csharp.check_for_overflow_underflowCheckForOverflowUnderflow检查算术溢出

代码分析

配置名.csproj 属性说明
csharp.analysis_levelAnalysisLevel分析级别
csharp.enable_net_analyzersEnableNETAnalyzers启用 .NET 分析器
csharp.enforce_code_style_in_buildEnforceCodeStyleInBuild构建时强制代码风格
csharp.warnings_as_errorsWarningsAsErrors将指定警告视为错误(列表)
csharp.warnings_not_as_errorsWarningsNotAsErrors排除的警告错误(列表)
csharp.error_logErrorLog错误日志
csharp.generate_documentation_fileGenerateDocumentationFile生成文档文件
csharp.documentation_fileDocumentationFile文档文件路径

发布与运行时

配置名.csproj 属性说明
csharp.runtime_identifierRuntimeIdentifier运行时标识符,如 win-x64linux-arm64
csharp.runtime_identifiersRuntimeIdentifiers多运行时标识符(列表)
csharp.self_containedSelfContained自包含部署
csharp.use_app_hostUseAppHost使用应用宿主
csharp.roll_forwardRollForward运行时前滚策略
csharp.publish_single_filePublishSingleFile发布为单文件
csharp.publish_trimmedPublishTrimmed发布时裁剪
csharp.trim_modeTrimMode裁剪模式
csharp.publish_ready_to_runPublishReadyToRunReadyToRun 预编译
csharp.invariant_globalizationInvariantGlobalization不变全球化
csharp.include_native_libraries_for_self_extractIncludeNativeLibrariesForSelfExtract自解压包含原生库
csharp.enable_compression_in_single_fileEnableCompressionInSingleFile单文件启用压缩
csharp.publish_aotPublishAotAOT 发布
csharp.strip_symbolsStripSymbols裁剪符号
csharp.enable_trim_analyzerEnableTrimAnalyzer启用裁剪分析器
csharp.json_serializer_is_reflection_enabled_by_defaultJsonSerializerIsReflectionEnabledByDefaultJSON 序列化反射默认启用
csharp.satellite_resource_languagesSatelliteResourceLanguages附属资源语言(列表)

包信息

配置名.csproj 属性说明
csharp.versionVersion包版本
csharp.assembly_versionAssemblyVersion程序集版本
csharp.file_versionFileVersion文件版本
csharp.informational_versionInformationalVersion信息版本
csharp.package_idPackageId包 ID
csharp.authorsAuthors作者
csharp.companyCompany公司
csharp.productProduct产品名
csharp.descriptionDescription描述
csharp.copyrightCopyright版权
csharp.repository_urlRepositoryUrl仓库 URL
csharp.repository_typeRepositoryType仓库类型
csharp.package_license_expressionPackageLicenseExpression包许可证表达式
csharp.package_project_urlPackageProjectUrl包项目 URL
csharp.neutral_languageNeutralLanguage中性语言
csharp.enable_preview_featuresEnablePreviewFeatures启用预览特性

输出

配置名.csproj 属性说明
csharp.generate_runtime_configuration_filesGenerateRuntimeConfigurationFiles生成运行时配置文件
csharp.copy_local_lock_file_assembliesCopyLocalLockFileAssemblies复制本地锁定文件程序集
csharp.append_target_framework_to_output_pathAppendTargetFrameworkToOutputPath输出路径追加目标框架,默认 false
csharp.append_runtime_identifier_to_output_pathAppendRuntimeIdentifierToOutputPath输出路径追加运行时标识符,默认 false
csharp.produce_reference_assemblyProduceReferenceAssembly生成引用程序集
csharp.disable_implicit_framework_referencesDisableImplicitFrameworkReferences禁用隐式框架引用
csharp.generate_target_framework_attributeGenerateTargetFrameworkAttribute生成目标框架属性

自定义属性

配置名说明
csharp.properties添加自定义 <PropertyGroup> 属性,格式为 "Name=Value"
lua
set_values("csharp.properties", "MyCustomProp=value", "AnotherProp=value2")