如何将非核心csproj转换为VS2017格式[重复]

问题描述 投票:21回答:2

这个问题在这里已有答案:

我在VS2015有两个项目

  1. 一个.NET Core(project.json,xproj)
  2. 一个常规的.NET csproj

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

Project 2适用于VS2017,但我喜欢将此csproj转换/迁移/更新为新的项目文件格式,以便受益于新的csproj功能(多目标,无大文件列表,可读csproj,csproj中的NuSpec信息等)

我怎么能这样做?我在VS2017中找不到一个选项。

使用:VS2017 RTM

upgrade visual-studio-2017 csproj
2个回答
3
投票

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 vs和旧版本中,目标无法按预期导入。这取决于您的目标是如何创作的,但是其中一个例子是使用VSSDK构建VSIX项目(VS扩展)在基于SDK的项目中很难实现。

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

同样值得指出的是,普通csproj文件中的很多垃圾只是生成的内容,而一点点的手工编辑可以大大有助于清理它。例如,使用通配模式可以在大型项目文件中保存数百行。这是基于SDK的项目如何工作的一部分 - 它们只是在SDK中执行,因此它不会显示在.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项目将自动检测文件何时在磁盘上更改并在项目中添加/删除它们;在重新加载项目之前,old-csproj不会在VS中更新它们。

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


8
投票

你可能值得花时间看看这些。看起来它不能用于更复杂的项目类型,但是控制台和库似乎是可升级的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

© www.soinside.com 2019 - 2024. All rights reserved.