如何使用VS2017升级csproj文件

时间:2017-03-07 22:39:03

标签: visual-studio upgrade csproj visual-studio-2017

到目前为止,VS2017已将多个基于project.json / .xproj的项目正确转换为新的.csproj格式。

我还想将新的.csproj格式用于之前仅针对.NET Framework的旧.csproj项目(即他们没有使用dnx / dotnet CLI)。

似乎即使一个项目仍然只针对.NET Framework,<PackageReference>和一个易于编辑的.csproj文件的好处似乎值得(希望不是太大)麻烦。

这可以直接与Visual Studio 2017一起使用吗?

如果没有,需要采取哪些手动步骤?

5 个答案:

答案 0 :(得分:32)

我正在编辑我的回答,以明确表示您不需要升级.csproj文件。正如Drew在下面评论的那样,这样做有好处。但是,VS2017将继续使用经典的csproj文件。此外,VS2017中没有任何内容可以为您执行升级。如果您确实希望利用新格式,请参阅下面的内容应该有所帮助。

对于简单的类库或控制台项目,将.csproj文件升级到新的Visual Studio 2017格式非常简单。

如果您未使用版本控制,请在开始之前确保备份csproj文件,Properties/AssemblyInfo.cspackages.config。新的csproj文件很棒。在许多项目中,我已经用十几个代码替换了数百行代码。但是,由于Visual Studio 2017继续支持以前的csproj文件,这可能是过早优化的情况。如果您的解决方案包含许多项目,许多NuGet包以及csproj的任何自定义,那么您可能正在进行不必要的make work项目。

使用适当的代码替换.csproj文件的全部内容,如下所示。

班级图书馆

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

控制台应用

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

<TargetFramework>属性更改为您需要的.NET版本,例如net452,net46,net461等。

默认情况下,编译器会拾取项目文件夹中的所有代码。如果项目文件夹外部有代码,则必须以与以前版本的Visual Studio和csproj相同的方式显式引用它。

完成上述更改后,在Visual Studio 2017中加载解决方案。此时应构建最基本的项目。如果不是,您可能需要添加缺少的程序集或项目引用。添加引用与在以前版本的Visual Studio中执行此操作非常相似。在解决方案资源管理器中选择您的项目,右键单击Dependencies,然后选择Add Reference。添加您缺少的任何框架或项目参考。

尝试再次构建您的解决方案/项目。您可能会收到有关重复属性的错误。此错误是因为先前在AssemblyInfo.cs中定义的属性已移至csproj文件。删除在“属性”文件夹下找到的AssemblyInfo.cs文件应该可以解决这些错误。在删除AssemblyInfo.cs之前,您应该移动您定义的任何数据。大多数属性都可以在项目文件的包信息部分中输入。右键单击项目名称,选择“包”页面,然后输入先前在AssemblyInfo.cs文件中定义的任何数据。这包括诸如汇编版本,作者,版权等项目。

以下是显示上一步的屏幕截图。

enter image description here

如果您在项目中使用任何NuGet包,则还需要将它们移动到新格式。在Visual Studio 2017之前,除了Packages.config中的引用之外,NuGet还依赖于项目根目录中名为csproj的文件。要迁移NuGet包引用,请右键单击您的解决方案并加载Nuget包管理器。一旦加载到右上角,单击cog,将加载NuGet包管理器选项。选择General。在“包管理”下,将选项Default package management format更改为PackageReference。此时,您必须手动将所有NuGet软件包添加回您的解决方案。您可以在项目的根文件夹中的packages.config文件中找到所有包。将所有软件包添加回来后,您可以删除packages.config文件。

答案 1 :(得分:18)

我为此创建了一个适用于csproj文件的工具:https://github.com/hvanbakel/CsprojToVs2017

您可以在csproj上运行它,然后转换文件并创建旧文件的备份。

答案 2 :(得分:2)

有一个很棒的工具可以自动将使用packages.config或project.json的项目转换为PackageReference。

https://marketplace.visualstudio.com/items?itemName=TaylorSouthwickMSFT.NuGetPackagetoProjectjsonConverter

  1. 将其安装到Visual Studio并右键单击解决方案

  2. 安装扩展程序后,打开解决方案并右键单击 Solution Explorer中的解决方案,然后单击Upgrade to Package 参考

  3. 选择后,项目将如下所示进行转换。强烈建议您在启用源代码控制的目录上执行此操作,以便在出现问题时轻松撤消。
  4. enter image description here

答案 3 :(得分:1)

有一个很棒的工具可以自动将csproj转换为新的SDK格式:

https://github.com/hvanbakel/CsprojToVs2017

enter image description here

当然,它不会转换ASP.NET项目,因为这些项目不支持新的SDK格式。所有其他项目都像魅力一样。

答案 4 :(得分:1)

Microsoft提供了一个try-convert工具(尽管不受支持),该工具可能会有用:

这是一个.NET Global Tool,可以安装:

dotnet tool install -g try-convert

一旦安装,请运行try-convert以获得说明。最简单的方法是:

try-convert -p MyProject.csproj

同样,请注意,这是不受支持的工具,可能无法可靠地运行。来自docs on porting from .NET Framework to .NET Core

此外,您可以尝试使用dotnet try-convert工具以一种操作将较小的解决方案或单个项目移植到.NET Core项目文件格式。 dotnet try-convert不能保证适用于所有项目,并且可能会导致您所依赖的行为发生细微变化。将其用作自动执行可自动化基本操作的起点。这不是移植项目的有保证的解决方案。

这是一个开源项目,可在GitHub上获得:

https://github.com/dotnet/try-convert