如何使用VS2017升级csproj文件

38

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

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

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

这是否可以在Visual Studio 2017中直接完成?

如果不能,需要哪些手动步骤?


似乎可以在非Core项目中使用新的.csproj,但有一些限制,详见此处 - Panagiotis Kanavos
1
是的,对于非Core项目使用新的csproj文件是可行的,但并非必须。请参见下面的答案。 - Mark
6个回答

35

我正在编辑我的答案,以明确指出您不需要升级您的.csproj文件。正如下面Drew评论的那样,这样做有好处。但是,VS2017仍然可以很好地使用传统的csproj文件。此外,VS2017中没有任何可以为您执行升级的内容。如果您确实希望利用新格式,下面的步骤应该会有所帮助。

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

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

请使用以下适当的代码替换整个.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版本非常相似。选择解决方案资源管理器中的项目,在“依赖项”上右键单击,然后选择“添加引用”。添加任何您缺少的框架或项目引用。

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

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

enter image description here

如果您在项目中使用任何NuGet包,您也需要将其移动到新格式。在Visual Studio 2017之前,NuGet依赖于项目根目录中名为Packages.config的文件以及csproj中的引用。为了迁移您的NuGet包引用,请右键单击解决方案并加载Nuget包管理器。一旦加载,在右上角点击齿轮,NuGet包管理器选项将加载。选择“常规”。在“包管理”下更改选项默认包管理格式为PackageReference。此时,您将不得不手动将所有NuGet包添加回您的解决方案。您可以在项目根文件夹的packages.config文件中找到所有包。添加完所有包后,您可以删除packages.config文件。


4
非常感谢您。以下是新项目的一些好处,这可能会激励您进行升级:1)更简单的管理NuGet依赖项(不再需要packages文件,并且不要求使用软件包管理器控制台或VS的管理NuGet软件包),2)能够直接在项目文件中定义NuGet软件包,3)能够在不卸载/重新加载的情况下编辑.csproj文件。 - Drew Noakes
@DrewNoakes 还有一个 .csproj 文件,它更容易通过版本控制进行管理,并且可以在合并期间手动编辑。我已经在几个项目中使用了 @thekip 的工具,并取得了很大的成功。 - seangwright

23

1
太好了,谢谢!我们使用你的工具无缝地转换了几个项目。可惜它不能与使用Entity Framework的项目一起使用。是什么阻止了这个工具的使用?是否有一种方法让工具尽可能地执行转换,知道之后需要进行一些手动修复呢? - Form

9

可以使用.NET Upgrade Assistant来实现。

安装步骤(将版本替换为最新版本,可在NuGet.org上检查):

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

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

  upgrade-assistant upgrade <project>.csproj

3

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

https://github.com/hvanbakel/CsprojToVs2017

enter image description here

当然,它无法转换ASP.NET项目,因为这些项目不支持新的SDK格式。但是其他项目都可以正常工作。

3
更新: 下面的工具链接已失效,但是自VS2017 15.7版本起,此功能已内置于Visual Studio中。
注意: 这仅更新NuGet引用机制。它不会更改为新的csproj类型。

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

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

  1. 将其安装到您的Visual Studio中

  2. 安装扩展后,打开您的解决方案并右键单击解决方案资源管理器中的解决方案,然后单击“升级为包引用”

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

enter image description here


2
这看起来非常有用,谢谢。请注意,它实际上并没有将 csproj 格式升级到较新的 .NET Core / dotnet SDK 样式,而是将旧样式的 packages.config 引用转换为现有 csproj 文件中的 <PackageReference> 元素。对于许多不需要针对 .NET Core 的项目来说,这可能实际上是可取的。 - Drew Noakes

3

微软开发了一个名为try-convert的工具(虽然不受支持),可能会有所帮助:

这是一个.NET全局工具,可以通过以下方式安装:

dotnet tool install -g try-convert

安装完成后,运行try-convert获取说明。最简单的方法是使用以下命令:
try-convert -p MyProject.csproj

请注意,这是一款不受支持的工具,可能无法可靠地工作。来自于.NET Framework迁移到.NET Core文档:

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

这是一个开源项目,可以在GitHub上找到:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接