VS2017如何升级csproj文件

Posted

技术标签:

【中文标题】VS2017如何升级csproj文件【英文标题】:How to upgrade csproj files with VS2017 【发布时间】:2017-07-28 07:59:56 【问题描述】:

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

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

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

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

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

【问题讨论】:

How to convert a non-core csproj to VS2017 format的可能重复 似乎可以将新的.csproj 用于非核心项目,但有限制,如shown here 是的,对非核心项目使用新的 csproj 文件是可能的,但不是必需的。请参阅下面的答案。 【参考方案1】:

我正在编辑我的答案,以明确您不需要升级您的 .csproj 文件。正如德鲁在下面评论的那样,这样做有好处。但是,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>

&lt;TargetFramework&gt;属性更改为您需要的.NET版本,例如net452、net46、net461等。

默认情况下,编译器会拾取项目文件夹中的所有代码。如果您的项目文件夹之外有代码,则必须像在以前版本的 Visual Studio 和 csproj 中一样显式引用它。

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

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

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

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

【讨论】:

非常感谢。新项目可能激发升级的一些好处:1) 更简单的 NuGet 依赖项管理(不再需要包文件,并且不需要使用包管理器控制台或 VS 的管理 NuGet 包),2) 定义 NuGet 包的能力直接在项目文件中,3)无需卸载/重新加载即可编辑 .csproj 文件的能力 @DrewNoakes 和一个.csproj 文件,它更容易通过版本控制进行管理,并且可以在合并期间手动编辑。我在几个项目中使用了@thekip 的工具并取得了很大的成功。【参考方案2】:

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

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

【讨论】:

这太好了,谢谢!我们使用您的工具无缝转换了几个项目。太糟糕了,它不适用于使用实体框架的项目。是什么阻止了它的工作?有没有办法让工具尽可能多地执行转换,知道之后需要一些手动修复?【参考方案3】:

有一个由 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

【讨论】:

【参考方案4】:

更新:下面的工具链接已经失效,但是从 VS2017 15.7 开始,这个功能是built-in to Visual Studio。

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


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

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

    将其安装到您的 Visual Studio

    安装扩展后,打开解决方案并右键单击 解决方案资源管理器中的解决方案,然后单击升级到包 参考文献

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

【讨论】:

这看起来很有用,谢谢。请注意,它实际上并未将 csproj 格式升级为较新的 .NET Core / dotnet SDK 样式,而是将旧样式 packages.config 引用转换为现有 csproj 文件中的 &lt;PackageReference&gt; 元素。对于许多不需要以 .NET Core 为目标的项目来说,这实际上可能是可取的。【参考方案5】:

Ona 可以为此使用 .NET Upgrade Assistant。

安装(更换最新版本,查看NuGet.org):

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

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

  upgrade-assistant upgrade <project>.csproj

【讨论】:

【参考方案6】:

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

https://github.com/hvanbakel/CsprojToVs2017

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

【讨论】:

以上是关于VS2017如何升级csproj文件的主要内容,如果未能解决你的问题,请参考以下文章

我可以将这个旧的 csproj 迁移到 VS2017 csproj 吗?

如何从 VS 2017 升级到 2019?

从以前的项目格式迁移到 VS2017 新项目格式

vs2017如何离线修改

vs2017有必要升级2019

Vs2017 typescript 开发小问题