如何将非核心csproj转换为VS2017格式

How to convert a non-core csproj to VS2017 format

我在 VS2015 中有两个项目

  1. 一个 .NET 核心(project.json、xproj)
  2. 一个常规 .NET csproj

当我用 VS2017 打开项目 1 时,它很好地迁移到新的 csproj 格式。

项目 2 在 VS2017 中工作,但我喜欢将此 csproj convert/migrate/update 转换为新的项目文件格式,以受益于新的 csproj 功能(多目标、无大文件列表、可读的 csproj、NuSpec 信息csproj 等)

我该怎么做?我在 VS2017 中找不到相应的选项。

使用:VS2017 RTM

VS 中没有内置选项,因为更简洁的 csproj 主要用于 .NET Core 项目。如果不在项目文件中做出一些努力和进一步的自定义,它不能完全与所有其他项目类型一起工作。例如,连接代码生成器或在 Winforms 或 WPF 应用程序中嵌套之类的东西对于新的 SDK 样式(新样式).csproj 可能无法开箱即用。这些通常可以通过根据需要更新元数据来解决:

<ItemGroup>
  <Compile Update="Properties\Resources.Designer.cs">
    <AutoGen>True</AutoGen>
    <DependentUpon>Resources.resx</DependentUpon>
  </Compile>
</ItemGroup>

请注意,Update 属性在这里很关键 - 您不想再次将文件包含在 ItemGroup 中,您只想更新其现有(或缺少)的元数据。

对于某些项目类型也有一些注意事项,在基于 SDK 的 csproj 和旧项目中目标没有按预期导入。这取决于您的目标是如何创作的,但是其中一个例子是使用 VSSDK 构建 VSIX 项目(VS 扩展)在基于 SDK 的项目中确实很难正确处理。

如果您想尝试转换,Nate McMaster's blog post 是一个很好的资源。他涵盖了从头开始和就地转换文件。我发现大多数情况下,从一个新的干净的 .csproj 开始并添加所需的任何解决方法都非常顺利。

还值得指出的是,您的普通 csproj 文件中的很多废话只是生成的内容,进行一些手动编辑可以大大有助于清理这些废话。例如,使用 globbing 模式可以在大型项目文件中节省数百行。这是基于 SDK 的项目无论如何工作方式的一部分 - 它们只是在 SDK 中执行 glob,因此它不会出现在 .csproj 中,但它的工作方式几乎相同。例如,如果你想包含一个文件夹下的所有 C# 文件(递归),你可以这样做:

<ItemGroup>
  <!-- Include all C# files under the SampleFolder and any child folders -->
  <Compile Include="SampleFolder\**\*.cs" />
  <!-- Include all C# files under this project's root: -->
  <Compile Include="**\*.cs" />
<ItemGroup>

** 匹配任何递归文件夹路径。

Visual Studio 行为存在一些差异,因为基于 SDK 的项目的新项目系统与旧的 .csproj 项目系统工作方式大不相同。例如,SDK-projects 将自动检测磁盘上的文件何时更改以及 add/remove 项目中的文件更改;在重新加载项目之前,old-csproj 不会在 VS 中更新它们。

如果您在任何地方都使用 globbing,您将 运行 遇到与基于 SDK 的 csproj 类似的问题,其中某些文件没有连接到它们的代码生成器或正确嵌套。如上所述,您可以使用 Update= 属性来修复特定文件(或更具体的 glob)以使元数据恢复原样。

这些可能值得您花时间看看。看起来更复杂的项目类型无法完成,但控制台和库似乎是可升级的 http://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/

https://github.com/NickCraver/PerfBenchmarks/commit/53c3013b1774056363dcab867bceb1b89ce9592c

关于添加更复杂的 sdk 类型,您可以观看此 github 问题。

https://github.com/dotnet/sdk/issues/491