三种方法设置 .NET/C# 项目的编译顺序,而不影响项目之间的引用

2023-10-22 11:36:24 浏览数 (2)

当 A 项目引用 B 项目,那么使用 Visual Studio 或者 MSBuild 编译 A 项目之前就会确保 B 项目已经编译完毕。通常我们指定这种引用是因为 A 项目确实在运行期间需要 B 项目生成的程序集。

但是,现在 B 项目可能仅仅只是一个工具项目,或者说 A 项目编译之后的程序集并不需要 B,仅仅只是将 B 打到一个包中,那么我们其实需要的仅仅是 B 项目先编译而已。

本文介绍如何影响项目的编译顺序,而不带来项目实际引用。

方法一:设置 ReferenceOutputAssembly

1 2 3 4

<ItemGroup> <ProjectReference Include="..Walterlv.Demo.AnalyzerWalterlv.Demo.Analyzer.csproj" ReferenceOutputAssembly="false" /> <ProjectReference Include="..Walterlv.Demo.BuildWalterlv.Demo.Build.csproj" ReferenceOutputAssembly="false" /> </ItemGroup>

详见 通过 ReferenceOutputAssembly=False 在引用项目时,不额外引入依赖文件 - walterlv。

方法二:设置解决方案级别的项目依赖

此方法可能会是更加常用的方法,但兼容性不那么好,可能在部分旧版本的 Visual Studio 或者 .NET Core 版本的 dotnet build 命令下不容易工作起来。

在解决方案上右键,然后选择“设置项目依赖”:

然后在弹出的项目依赖对话框中选择一个项目的依赖:

详见:通过设置 sln 解决方案依赖,确保不引用的两个项目之间有明确的编译顺序 - walterlv。

方法三:使用 MSBuild 编译任务来编译其他项目

1 2 3 4 5 6 7 8 9 10 11

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net48</TargetFramework> </PropertyGroup> <Target Name="BuildTheCompilerProject" BeforeTargets="BeforeBuild"> <MSBuild Projects="..Walterlv.Packages.CompilerWalterlv.Packages.Compiler.csproj" Targets="Build" Properties="Configuration=$(Configuration);Platform=$(Platform)" /> </Target> </Project>

详见 Visual Studio 在编译 A 项目时,确保 B 项目已编译 - walterlv。

使用哪一种?

ReferenceOutputAssembly

解决方案依赖

MSBuild 编译任务

位置

项目文件(csproj)或编译文件(*.props / *.targets)

解决方案文件(sln)

项目文件(csproj)或编译文件(*.props / *.targets)

编译项目

✔️生效

❌无效

✔️生效

编译解决方案

✔️生效

✔️生效

✔️生效

拷贝依赖项目的输出文件

⚠是

要求匹配目标框架TargetFramework

⚠是

占用一个编译时机

⚠是

兼容性

✔️

⚠早期版本的dotnet build 不支持

✔️

✔️优势

❌劣势

⚠可能优可能劣(但在本文场景是劣势)

位置:代码可以写到哪些文件中

编译项目:使用 dotnet build 或者 msbuild 命令来编译时,传入项目文件

编译解决方案:使用 dotnet build 或者 msbuild 命令来编译时,传入解决方案文件

拷贝依赖项目的输出文件:如果 A 项目引用 B 项目,那么 B 项目的输出文件会被自动拷贝到 A 项目的输出目录中

要求匹配目标框架:必须匹配的框架才能引用,例如 net48 能引用 net45,netcoreapp3.1 能引用 netstandard2.0,但 net45 不能引用 netcoreapp3.1

占用一个编译时机:在此编译时机之前的依赖是无效的(详见:Visual Studio 在编译 A 项目时,确保 B 项目已编译)

参考资料

  • Question about Visual Studio *.sln file format - Stack Overflow

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/affects-project-building-order.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。

0 人点赞