以前的项目格式使用的是 csproj 的格式,但是 .net core 支持使用 project.json 格式的项目文件,后来还是决定不使用这个格式。 VS2017 的项目格式更好读、更简单而且减少了 git 冲突。

本文来告诉大家如何从 VS2015 和以前的项目格式修改为 VS2017 项目格式。

在迁移之前,我需要告诉大家,现在是2018年1月15日,最新的项目格式只有对下面的项目支持

  • class library projects 类库项目
  • console apps 控制项目
  • ASP.NET Core web apps asp 项目
  • .NET Core .NET Core

对于 UWP 和 WPF ,有 xaml 的项目是没有很好支持,如果你的项目是 WPF 的,那么请不要再往下看。

现在很多项目,测试项目都使用新格式,建议在测试项目试试

建议从一个测试项目试试,先做好提交,如果失败可以回滚。

如果创建是库项目,那么 csproj 只有下面的代码

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
</Project>

如果创建的是控制项目,那么只有下面的代码

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
</Project>

如果创建的是测试项目,那么只有下面的代码

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
<PackageReference Include="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
</ItemGroup>
</Project>

如果想知道新格式和之前的区别,如何从以前的格式迁到新的格式,请看下面

下面从项目的第一行开始

原来的第一行是

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

新的格式的第一行是

<Project Sdk="Microsoft.NET.Sdk">

可以看到新的格式的代码比较少

其实建议大家重新创建一个项目,然后把文件放进去,安装 Nuget 不然需要修改比较多。

必须删除

下面的代码必须删除

<!-- usually at the top of the file -->
<!-- 下面的代码一般在文件的最前 -->
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <!-- usually at the bottom -->
<!-- 一般在文件的最后面 -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />

必须修改

需要修改平台的代码

这是以前的代码

<PropertyGroup>
<!-- ... -->
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
</PropertyGroup>

需要修改为下面的代码

<PropertyGroup>
<TargetFramework>net452</TargetFramework>
</PropertyGroup>

如果是 v4.5.2 ,请修改为 net452 ,如果是 v4.6 就修改为 net46

添加文件

现在新的格式可以使用通配添加文件,例如在文件夹的所有的代码都需要添加,可以使用这个方式

<Compile Include="lindexi\*.cs" />

默认是下面代码

<!-- the defaults -->
<Compile Include="**\*.cs" />
<EmbeddedResource Include="**\*.resx" />

所以添加的 cs 文件都会添加到编译,需要删除这个代码才可以不编译一些文件

项目引用

之前的方式需要添加很多代码,如引用 ClassLibrary1 的项目,需要写下面的代码

<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
<Project>{2C7DF870-5B35-49EF-963D-EE1E72C3177E}</Project>
<Name>ClassLibrary1</Name>
</ProjectReference>

Project 这个可以表示这是一个类库或一个其他的项目,因为新的项目不需要这个,所以在新建文件的时候就不知道给哪个项目,这是比较差的

新的格式就需要下面的代码

<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" />

如果引用的项目有依赖,以前的格式需要把引用写在文件,现在不需要添加引用

假如有 A 引用 B ,B 引用 C ,那么之前的A项目文件就是这样

<ProjectReference Include="..\ProjectB\ProjectB.csproj">
<Project>{A900C843-8340-421B-B4F0-6C65A0D093C4}</Project>
<Name>ProjectB</Name>
</ProjectReference>
<ProjectReference Include="..\ProjectC\ProjectC.csproj">
<Project>{871AC142-FC46-49F5-A5E0-90436648B9C5}</Project>
<Name>ProjectB</Name>
</ProjectReference>

现在的文件格式不需要写引用

<ProjectReference Include="..\ProjectB\ProjectB.csproj" />

引用包

之前的 Nuget 引用需要添加 packages.config 和 csproj 才可以使用,现在的 Nuget 4 可以直接在 csproj 添加引用

这是之前的格式

<Import Project="..\..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props')" />

<ItemGroup>
<None Include="packages.config" /> <Reference Include="MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>

新的格式写引用,不需要 packages.config 文件,这样减少了找不到nuget的坑,下面代码就是新的格式,可以看到代码减少1/2

<ItemGroup>
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
<PackageReference Include="MySql.Data" Version="6.9.9" />
</ItemGroup>

这个格式可以在git冲突比较容易看到哪里需要修改,所以解决冲突很简单

在 nuget 2 的引用,如果引用了包A,他引用了 B ,那么就需要在 packages.config 引用写了这几个项目

<?xml version="1.0" encoding="utf-8"?>
<!-- in packages.config -->
<packages>
<package id="A" version="2.2.0" targetFramework="net452" />
<package id="B" version="2.0.1" targetFramework="net452" />
</packages>

现在 Nuget 4 需要写引用的库,不需要写他的引用,所以可以减少代码,添加了id和版本就好

<ItemGroup>
<PackageReference Include="A" Version="2.2.0" />
</ItemGroup>

如果在迁移过程遇到诡异的问题,请看将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件 - walterlv

参见:Old csproj to new csproj: Visual Studio 2017 upgrade guide


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

最新文章

  1. keil中出现Undefined symbol FLASH_PrefetchBufferCmd (referred from main.o)等问题解决办法
  2. ORA-00600: internal error code, arguments: [kcblasm_1], [103], [], [], [], [], [], []
  3. iOS OAuth2.0认证和SSO授权
  4. RadioButtonList单选和RequiredFieldValidator验证是否选中
  5. (重)POJ 3020Antenna Placement
  6. Codec plugins ? multiline
  7. JS浏览器对象-计时器
  8. Cocos2d-x 架构一个游戏的一般思路
  9. Oracle游标循环更新数据案例
  10. Sqoop处理Clob与Blob字段
  11. Beginning Python From Novice to Professional (4) - 演示样本格式字符串
  12. mysql随记
  13. spring切面编程AOP 范例一
  14. 37. leetcode 108. Convert Sorted Array to Binary Search Tree
  15. .Net高级进阶,WebApi和MVC进行模型验证的时候,教你如何自由控制需要进行验证的字段?
  16. 七、VueJs 填坑日记之渲染一个列表
  17. spring+jidi读取property的配置文件
  18. Android开发学习之路--Service之初体验
  19. mahout系列----Dirichlet 分布
  20. [Linux]标准IO全缓冲和行缓冲

热门文章

  1. 截图-----Selenium快速入门(十二)
  2. C# Po3协议读取邮件内容遇到的问题
  3. Asp.net MVC4 记录在线用户数及登录时长
  4. On extracting ops from LLVM backend
  5. shiro之深度解析FormAuthenticationFilter
  6. Nginx + uWSGI 部署Django 项目,并实现负载均衡
  7. Python大法之从火车余票查询到打造抢Supreme神器
  8. 【zookeeper】Apache curator的使用及zk分布式锁实现
  9. 2019 OO第一单元总结(表达式求导)
  10. 爬虫常用库之pyquery 库