VS2017 C#解决方案能否定义全局变量替代HintPath硬编码路径?
当然可以!VS2017依托MSBuild的强大能力,完全支持在解决方案级别定义变量/宏,用来统一管理第三方库这类共享路径,避免每个项目里硬编码重复路径。下面是具体的实现步骤:
创建解决方案级别的变量定义文件
在你的解决方案根目录下新建一个XML文件,比如命名为Directory.Build.props(这个文件名是MSBuild的约定,会被所有子项目自动识别并导入,不用手动修改每个csproj)。文件内容示例如下:<?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <!-- 自定义变量,命名可以根据需求调整 --> <ThirdPartyRoot>c:\thirdparty</ThirdPartyRoot> </PropertyGroup> </Project>如果你不想用自动导入的方式,也可以创建一个自定义命名的props文件(比如
SolutionSharedVariables.props),之后需要手动在每个项目的csproj文件开头添加导入语句:<Import Project="$(SolutionDir)SolutionSharedVariables.props" />这里
$(SolutionDir)是MSBuild内置的变量,指向当前解决方案的根目录。修改项目中的HintPath引用
打开需要调整的项目文件(.csproj),找到带有硬编码HintPath的Reference节点,把硬编码的路径前缀替换成你定义的变量。比如原来的:<Reference Include="my_assembly"> <HintPath>c:\thirdparty\comp\1.2.3\my_assembly.dll</HintPath> </Reference>修改为:
<Reference Include="my_assembly"> <HintPath>$(ThirdPartyRoot)\comp\1.2.3\my_assembly.dll</HintPath> </Reference>团队协作的小技巧
如果团队成员的第三方库路径不一致,可以额外创建Directory.Build.props.user文件(这个文件不要提交到版本控制),在里面覆盖变量值:<?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <ThirdPartyRoot>D:\my-local-thirdparty</ThirdPartyRoot> </PropertyGroup> </Project>MSBuild会优先读取.user文件里的变量,这样既保证了团队配置的统一性,又支持个人本地路径的自定义。
需要注意的是,MSBuild的变量是不区分大小写的,但为了可读性,建议保持命名风格一致。另外,VS2017使用的MSBuild版本已经完全支持这些特性,修改后重新加载解决方案就能生效。
内容的提问来源于stack exchange,提问作者LarsA

