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

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

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


本文内容

  • 方法一:设置 ReferenceOutputAssembly
  • 方法二:设置解决方案级别的项目依赖
  • 使用哪一种?

方法一:设置 ReferenceOutputAssembly

依然在项目中使用往常习惯的方法设置项目引用:

但是,在项目引用设置完成之后,需要打开项目的项目文件(.csproj)给 ProjectReference 节点加上 ReferenceOutputAssembly 的属性设置,将其值设置为 false。这表示仅仅是项目引用,而不将项目的任何输出程序集作为此项目的依赖。

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

上面的 ProjectReference 是 Sdk 风格的 csproj 文件中的项目引用。即便不是 Sdk 风格,也是一样的加这个属性。

当然,你写多行也是可以的:

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

这种做法有两个非常棒的用途:

  1. 生成代码

    • 依赖的项目(如上面的 Walterlv.Demo.Build)编译完成之后会生成一个可执行程序,它的作用是为我们当前的项目生成新的代码的。
    • 于是我们仅仅需要在编译当前项目之前先把这个依赖项目编译好就行,并不需要生成运行时的依赖。
  2. NuGet 包中附带其他文件
    • 如果要生成 NuGet 包,我们有时需要多个项目生成的文件来共同组成一个 NuGet 包,这个时候我们需要的仅仅是把其他项目生成的文件放到 NuGet 包中,而不是真的需要在 NuGet 包级别建立对此项目的依赖。
    • 当使用 ReferenceOutputAssembly 来引用项目,最终生成的 NuGet 包中就不会生成对这些项目的依赖。

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

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

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

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

这时,如果看看解决方案文件(.sln)则可以看到多出了 ProjectDependencies 区:

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Walterlv.Demo", "Walterlv.Demo\Walterlv.Demo.csproj", "{DC0B1D44-5DF4-4590-BBFE-072183677A78}"ProjectSection(ProjectDependencies) = postProject{98FF9756-B95A-4FDB-9858-5106F486FBF3} = {98FF9756-B95A-4FDB-9858-5106F486FBF3}EndProjectSection
EndProject

更多关于 sln 文件的理解,可以阅读我的另一篇博客:

  • 理解 Visual Studio 解决方案文件格式(.sln)

使用哪一种?

使用 ReferenceOutputAssembly 属性设置的方式是将项目的编译顺序指定到项目文件中的,这意味着如果使用命令行单独编译这个项目,也是能获得提前编译目标项目的效果的,而不需要打开对应的解决方案编译才可以获得改变编译顺序的效果。

不过使用 ReferenceOutputAssembly 的一个缺陷是,必须要求目标框架能够匹配。比如 .NET Core 2.1 的项目就不能引用 .NET Core 3.0 或者 .NET Framework 4.8 的项目。

而在解决方案级别设置项目依赖则没有框架上的限制。无论你的项目是什么框架,都可以在编译之前先编译好依赖的项目。只是旧版本的 MSBuild 工具和 dotnet build 不支持 ProjectDependencies 这样的解决方案节点,会导致要么不识别这样的项目依赖(从而实际上并没有影响编译顺序)或者无法完成编译(例如出现 Error parsing the nested project section in solution file. 错误)。


参考资料

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

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

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

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

  1. 两种方法设置disabled属性

    两种方法设置disabled属性 //两种方法设置disabled属性 $('#fileup').attr("disabled",true); $('#fileup').attr( ...

  2. 两种方法设置html表格的宽高

    文章目录 第一种方法 第二种方法(利用css) 第一种方法 第二种方法(利用css) 1.使用border属性设置表格的边框 2.给table表格设置一个class属性,设置为"mytabl ...

  3. 两种方法设置Word文档的“只读模式”

    防止Word文档被意外更改,我们可以将Word设置成"只读模式"来保护文档.根据需要,还可以将Word可以设置成无密码和有密码的"只读模式",下面来说说具体方法 ...

  4. 苹果6p计算机在哪里设置方法,苹果恢复出厂设置在哪里 两种方法设置【图文】...

    苹果 手机虽然有着防水的功能,我们也切勿将它放在潮湿的环境之下,尤其是厕所与 厨房 ,更要严令禁止存放.除此之外,我们在为苹果手机充电的时候也要适可而止,若是超过八个小时,便可能缩短手机电池的使用寿命 ...

  5. vue项目动态设置浏览器标题title两种方法

    各位铁汁们,老步骤先效果图奉上 方法一.使用插件vue-wechat-title来设置浏览器动态标题 第一步:安装插件 1. npm vue-wechat-title --save 第二步:在全局ma ...

  6. 多个html如何套用套一个头部,Vue.js项目中管理每个页面的头部标签的两种方法...

    在 Vue SPA 应用中,如果想要修改 HTML 的头部标签,如页面的 title ,我们只能去修改 index.html 模板文件,但是这个是全局的修改,如何为每个页面都设置不一样的 title ...

  7. Android项目开发:指南针(两种方法实现)

    Android项目开发:指南针应用的实现 1.基于方向传感器 activity_main.xml MainActivity.java 2.基于加速度传感器和地磁传感器 在Android中可以使用内置传 ...

  8. 在Web项目中保存会话的两种方法:Cookie和Session

    Web浏览器是与Web服务器之间的会话是一个不保持的会话,浏览器发起请求,建立会话,获得结果后,会话就不在了.然而,在涉及到用户登录Web项目中,开发人员必须有一种方法,区分用户登录前后的状态,以便对 ...

  9. css如何设置透明度?设置透明度的两种方法(代码实例)

    在前端页面开发布局的时候,为了给用户呈现不同的效果,经常需要设置透明度,那么css是怎样设置透明度的?本章给大家介绍用css设置透明度的两种方法(代码实例).有一定的参考价值,有需要的朋友可以参考一下 ...

最新文章

  1. Brocade光纤交换机FOS升级
  2. 【错误记录】Android 低版本使用分区存储错误 ( 低版本存储不得使用 MediaStore )
  3. ASP.NET AJAX + JSON 实现对象调用
  4. Struts2之异常机制
  5. 动画片动漫迷<未来的未来>高清图片壁纸
  6. C#开发Activex控件--与JavaScript的互调
  7. 关于使用SharedObject来缓存游戏图片或者swf文件资源到客户端本地的研究
  8. ZooKeeper官方文档学习笔记03-程序员指南
  9. ndk编译出来的executable动态库入口函数的参数错乱
  10. leftjoin多了性能下降_SBR胶乳改性剂用量对乳化沥青及微表处性能影响
  11. HTML标记特定,制作asp:标记特定的HTML标记
  12. python爬虫-book118
  13. 致远项目管理SPM系统之合同基本信息管理
  14. 主流游戏引擎分析 【端游 、页游 、手游 解析】
  15. java 数组写入txt_java编程,如何把一个数组中的内容写入一个txt文档中
  16. 信息安全专业学习建议
  17. 按键精灵版QQ自动加好友脚本分享
  18. keil更改黑色背景颜色
  19. CF869 E. The Untended Antiquity
  20. 我热爱计算机作文450字,热爱音乐的我作文450字

热门文章

  1. 微信小程序:个人页面/我的页面/资料页面
  2. iOS逆向:微信逆向及动态库开发过程中的坑
  3. 软工网络15团队作业7——Alpha冲刺之事后诸葛亮
  4. 02《区块链财富指北》私钥篇(2):百行Python代码演示一私钥生成多公链公钥原理。
  5. 每月生活费上万元,这届大学生花钱有多狠?
  6. 【思科ACI】APIC手动安装及升级
  7. 深入浅出JS—15 ES6中Proxy及Reflect的使用
  8. 算法实现数字编号翻译为英文
  9. 目前以太网主要采用什么连接计算机,目前以太网主要采用______连接计算机,计算机能够独享带宽...
  10. php返回值乱码,php中文返回乱码怎么办