到目前为止,VS2017已将多个基于project.json
/ .xproj
的项目正确转换为新的.csproj
格式。
我还想将新的.csproj
格式用于之前仅针对.NET Framework的旧.csproj
项目(即他们没有使用dnx / dotnet CLI)。
似乎即使一个项目仍然只针对.NET Framework,<PackageReference>
和一个易于编辑的.csproj
文件的好处似乎值得(希望不是太大)麻烦。
这可以直接与Visual Studio 2017一起使用吗?
如果没有,需要采取哪些手动步骤?
答案 0 :(得分:32)
我正在编辑我的回答,以明确表示您不需要升级.csproj
文件。正如Drew在下面评论的那样,这样做有好处。但是,VS2017将继续使用经典的csproj
文件。此外,VS2017中没有任何内容可以为您执行升级。如果您确实希望利用新格式,请参阅下面的内容应该有所帮助。
对于简单的类库或控制台项目,将.csproj
文件升级到新的Visual Studio 2017格式非常简单。
如果您未使用版本控制,请在开始之前确保备份csproj
文件,Properties/AssemblyInfo.cs
和packages.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
文件中定义的任何数据。这包括诸如汇编版本,作者,版权等项目。
以下是显示上一步的屏幕截图。
如果您在项目中使用任何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。
答案 3 :(得分:1)
有一个很棒的工具可以自动将csproj转换为新的SDK格式:
https://github.com/hvanbakel/CsprojToVs2017
当然,它不会转换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上获得: