惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Troy Hunt's Blog
Scott Helme
Scott Helme
T
Threat Research - Cisco Blogs
T
Tenable Blog
L
LINUX DO - 热门话题
V
Visual Studio Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
Know Your Adversary
Know Your Adversary
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
Netflix TechBlog - Medium
SecWiki News
SecWiki News
I
InfoQ
Microsoft Security Blog
Microsoft Security Blog
Project Zero
Project Zero
W
WeLiveSecurity
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
Recorded Future
Recorded Future
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
S
Securelist
Spread Privacy
Spread Privacy
L
LangChain Blog
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The Last Watchdog
The Last Watchdog
Attack and Defense Labs
Attack and Defense Labs
博客园 - 司徒正美
Help Net Security
Help Net Security
L
Lohrmann on Cybersecurity
人人都是产品经理
人人都是产品经理
Forbes - Security
Forbes - Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
PCI Perspectives
PCI Perspectives
博客园 - 【当耐特】
T
Tor Project blog

博客园 - Charltsing

C# 预处理器指令语言 - 完整语法速查 LoggerMessage:编写高性能的 .NET 日志 PDFImageViewer v2.1 PDF查看图像和无损导出工具,一键转换单图PDF为JBig2黑白PDF。兼谈PDF内嵌图像。 PDF的色彩空间 25 个使用.NET 10 的性能技巧 PDFontFixer v1.5 免费版,解决PDF文档复制粘贴乱码的问题,修复PDF文档字体的Unicode映射。 为什么 PDF 编辑这么难? Unicode、UTF-8、UTF-16 如何直接编辑Github的Readme.md文件 新版 C# 高效率编程指南 C# 内联数组(Inline Array):高性能数组的新选择 如何在 .NET 中使用 SIMD .NET异步编程进阶:从语法糖到高性能架构的核心突破 C# 中的安全零拷贝 使用UnsafeAccessor 访问私有字段 C# 12与.NET 8实战指南:20个提升代码质量的最佳实践 C# Net9的模块初始化器(Module Initializer) ECMA-335 CLI 规范附录 C#中避免GC压力和提高性能的8种技术 函数内联 硬件内在函数 官方:oPDF v2.1免费版,专业的PDF水印分析处理工具,无损去除水印,通杀八类PDF水印。它是PDFCommander 万能PDF水印删除工具的升级版。 C#自动引用Debug | Release版本的dll
自动导入工程项目属性,Directory.Build.props 和 Directory.Build.targets
Charltsing · 2026-01-15 · via 博客园 - Charltsing

在 MSBuild 15 的一个新的功能就是让开发者可以自己定义项目信息放在一个文件,这个文件会在 Microsoft.Common.props 引用,而且会在csproj项目文件所在的文件夹开始寻找,只要找到存在Directory.Build.props文件就会自动导入里面的内容。除了定义Directory.Build.props之外,还可以定义 Directory.Build.targets 文件,不同的只是这个文件是在 Microsoft.Common.targets使用。

Directory.Build.props 是 MSBuild 提供的一个**“魔法文件”** ——
只要把它放在 repo 的任意一级目录下,MSBuild 会自动把它注入到该目录下(及所有子目录)的每一个 .csproj 项目文件里,无需任何 <Import>。

放置位置 影响范围
/Directory.Build.props 整个仓库的所有项目
/src/Directory.Build.props /src 及其所有子目录里的项目
/tests/Directory.Build.props /tests 及其所有子目录里的项目
典型用途
统一 TargetFramework、Nullable、ImplicitUsings
统一 Company、Copyright、VersionPrefix
统一 PackageReference(如日志、JSON、测试框架)
统一 CodeAnalysis 规则集、强命名、签名文件路径
最小可运行示例
文件: /Directory.Build.props

<Project>
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Company>MySoft</Company>
<VersionPrefix>1.2.0</VersionPrefix>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
</ItemGroup>
</Project>

之后任何 .csproj 都会自动继承上述设置,不需要写一行 <Import> 。

⚠️ 注意点
文件名必须一字不差:Directory.Build.props,大小写敏感(Linux/macOS)。
如果子目录里也有同名文件,离项目最近的那一份获胜(可覆盖上级)。
与手动 <Import> 的 .props 不冲突,但 Directory.Build.props 先执行,后执行 .csproj 本身的内容,因此 .csproj 里的值可以覆盖它。


还有一个对应文件:Directory.Build.targets,作用相同,但在 .csproj 之后执行,适合做 Target 定义。
下面给出一个可直接放到仓库根目录的 Directory.Build.targets 示例,演示几个典型用法:

编译后把 README.md 拷到输出目录
统一给所有 PackageReference 打补丁,强制把 PrivateAssets="all" 加到 Newtonsoft.Json 上
在 AfterBuild 里打印一条“构建完成”的提示
文件:/Directory.Build.targets

<Project>
<!-- 1. 把 README.md 复制到输出目录 -->
<Target Name="CopyReadme" AfterTargets="Build">
<ItemGroup>
<ReadmeFile Include="$(MSBuildThisFileDirectory)README.md" />
</ItemGroup>
<Copy SourceFiles="@(ReadmeFile)"
DestinationFolder="$(TargetDir)"
SkipUnchangedFiles="true" />
</Target>

<!-- 2. 强制给 Newtonsoft.Json 加上 PrivateAssets="all" -->
<Target Name="PatchNewtonsoft" BeforeTargets="CollectPackageReferences">
<ItemGroup>
<PackageReference Condition=" '%(PackageReference.Identity)' == 'Newtonsoft.Json' ">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Target>

<!-- 3. 构建完成后打印提示 -->
<Target Name="SayDone" AfterTargets="Build">
<Message Text=" Build finished: $(MSBuildProjectName) -> $(TargetPath)" Importance="high" />
</Target>
</Project>

使用方式
把文件保存为 /Directory.Build.targets(或任意子目录,作用范围同 Directory.Build.props)。
无需任何 <Import>,下次 dotnet build 会自动生效。