如何用VS2017升级csproj文件

How to upgrade csproj files with VS2017

VS2017 目前已经正确地将几个基于 project.json/.xproj 的项目转换为新的 .csproj 格式。

我还想将新的 .csproj 格式与以前仅针对 .NET Framework 的旧 .csproj 项目一起使用(即它们不能与 dnx/dotnet CLI 一起使用)。

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

这是否可以直接与 Visual Studio 2017 相关?

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

我正在编辑我的答案,以明确您不需要升级 .csproj 文件。正如德鲁在下面评论的那样,这样做有好处。但是,VS2017 将继续正常使用 classic csproj 文件。此外,VS2017 中没有任何东西可以为您执行升级。如果您确实希望利用新格式,下面的演练应该会有所帮助。

.csproj 文件升级到新的 Visual Studio 2017 格式对于简单的 class 库或控制台项目来说很容易。

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

用以下适当的代码替换 .csproj 文件的全部内容。

Class图书馆

<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 的早期版本中添加引用非常相似。 Select 您在解决方案资源管理器中的项目,右键单击 Dependencies,然后 select Add Reference。添加您缺少的任何框架或项目引用。

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

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

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

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

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

更新:下面的工具 link 已失效,但从 VS2017 15.7 开始,此功能是 built-in to Visual Studio.

注意:这仅更新了 NuGet 引用机制。它不会更改为新的 csproj 类型。


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

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

  1. 将其安装到您的 Visual Studio

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

  3. 选中后,工程会变成如下图。强烈建议您在启用 source-control 的目录上执行此操作,以便在出现问题时轻松撤消。

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

https://github.com/hvanbakel/CsprojToVs2017

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

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:

Additionally, you can attempt to port smaller solutions or individual projects in one operation to the .NET Core project file format with the dotnet try-convert tool. dotnet try-convert is not guaranteed to work for all your projects, and it may cause subtle changes in behavior that you depended on. Use it as a starting point that automates the basic things that can be automated. It isn't a guaranteed solution to migrating a project.

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

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

Ona 可能会使用 .NET Upgrade Assistant

安装(用最新版本替换版本,检查NuGet.org):

  dotnet tool install --global upgrade-assistant --version 0.3.310801

启动交互过程,完成第2步“将项目文件转为SDK样式”后退出:

  upgrade-assistant upgrade <project>.csproj