当前位置: 首页 > news >正文

如何在 MSBuild 的项目文件 csproj 中获取绝对路径

通常我们能够在 csproj 文件中仅仅使用相对路径就完成大多数的编译任务。但是有些外部命令的执行需要用到绝对路径,或者对此外部工具来说,相对路径具有不同的含义。这个时候,就需要将相对路径在 csproj 中转换为绝对路径来使用。

本文介绍如何在项目文件 csproj 中将一个相对路径转换为绝对路径。


在 MSBuild 4.0 中,可以在 csproj 中编写调用 PowerShell 脚本的代码,于是获取一个路径的绝对路径就非常简单:

[System.IO.Path]::GetFullPath('$(WalterlvRelativePath)')

具体到 csproj 的代码中,是这样的:

<Project>
    <PropertyGroup>
        <WalterlvRelativePath>$(OutputPath)</WalterlvRelativePath>
        <_WalterlvAbsolutePath>$([System.IO.Path]::GetFullPath($(WalterlvRelativePath)))</_WalterlvAbsolutePath>
    </PropertyGroup>
</Project>

这样,就可以使用 $(_WalterlvAbsolutePath) 属性来获取绝对路径。

你可以阅读我的其他篇博客了解到 $(OutputPath) 其实最终都会是相对路径:

  • 项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv
  • 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀) - walterlv

参考资料

  • How can I get MSBUILD to evaluate and print the full path when given a relative path? - Stack Overflow
  • Demonstrates how you can convert a relative path to an absolute path in MSBuild

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

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

知识共享许可协议

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

相关文章:

  • C# 跨设备前后端开发探索
  • MSBuild 如何编写带条件的属性、集合和任务 Condition?
  • WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
  • 如何快速自定义 Visual Studio 中部分功能的快捷键
  • C# 8.0 如何在项目中开启可空引用类型的支持
  • C# 8.0 可空引用类型中的各项警告/错误的含义和示例代码
  • C# 可空引用类型 NullableReferenceTypes 更强制的约束:将警告改为错误 WarningsAsErrors
  • ClearType 的原理:Windows 上文本的亚像素控制
  • 使用 7-Zip 的命令行版本来压缩和解压文件
  • 在项目文件 csproj 中或者 MSBuild 的 Target 中使用 % 引用集合中每一项的属性
  • MSBuild 中的特殊字符($ @ % 等):含义、用法以及转义
  • WPF 获取元素(Visual)相对于屏幕设备的缩放比例,可用于清晰显示图片
  • Visual Studio 通过修改项目的调试配置文件做到临时调试的时候不要编译(解决大项目编译缓慢问题)
  • 使用 dotnet 命令行配合 vscode 完成一个完整 .NET 解决方案的编写和调试
  • 如何修改 Visual Studio 新建项目时的默认路径
  • 时间复杂度分析经典问题——最大子序列和
  • 345-反转字符串中的元音字母
  • CentOS从零开始部署Nodejs项目
  • idea + plantuml 画流程图
  • Java反射-动态类加载和重新加载
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 数据科学 第 3 章 11 字符串处理
  • 算法---两个栈实现一个队列
  • 一个完整Java Web项目背后的密码
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 再谈express与koa的对比
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 第二十章:异步和文件I/O.(二十三)
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​Python 3 新特性:类型注解
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​虚拟化系列介绍(十)
  • #define 用法
  • #pragam once 和 #ifndef 预编译头
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (1)(1.13) SiK无线电高级配置(五)
  • (12)Hive调优——count distinct去重优化
  • (ZT)薛涌:谈贫说富
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (七)c52学习之旅-中断
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)大型网站的系统架构
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .naturalWidth 和naturalHeight属性,
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 中的轻量级线程安全
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET值类型变量“活”在哪?
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色