【问题标题】:How-to migrate Wpf projects to the new VS2017 format如何将 Wpf 项目迁移到新的 VS2017 格式
【发布时间】:2017-04-29 08:44:42
【问题描述】:

我正在将我的项目迁移到新的 Visual Studio 2017 格式,该格式适用于所有标准库,只是现在我在使用 Wpf / Xaml 的 UI 库中遇到了问题。

我不知道如何为我的用户控件执行此操作。旧项目似乎不再有效。

任何人都知道如何做到这一点,或者是否有可能。

【问题讨论】:

  • 你说的旧项目似乎不再有效是什么意思?构建失败,还是在运行时抛出异常?
  • 新项目格式似乎无法识别/构建 xaml 文件
  • 您是否创建了新项目?为什么?您应该可以在 VS 2017 中打开原始项目
  • 我想通过使用新的包引用和 *.cs 包含来简化我的项目文件。
  • 您是否安装了正确的工作负载?对于 WPF,它的 .Net 桌面开发。

标签: c# wpf visual-studio-2017


【解决方案1】:

2018 年 12 月 13 日 - .NET Core 3 Preview 1 was announced

.NET Core 3 将支持 WPF 和 WinForms 应用程序。你可以试试 SDK 的预览版:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>
</Project>

上一个答案

您可以使用下面的模板来替换旧的 .csproj。它解决了其他人模板遇到的几个问题。

  1. 您不必像某些人建议的那样包含中间 *.g.cs 文件。
  2. 不会出现Main not found 错误。
  3. 不会出现Unable to run your project. The "RunCommand" property is not defined. 错误。
  4. 包括已配置的默认设置和资源。

模板:

<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
  <PropertyGroup>
    <LanguageTargets>$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.CSharp.targets</LanguageTargets>
    <TargetFramework>net47</TargetFramework>
    <OutputType>WinExe</OutputType>
    <StartupObject />
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>full</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>

  <ItemGroup>
    <!-- App.xaml -->
    <ApplicationDefinition Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </ApplicationDefinition>

    <!-- XAML elements -->
    <Page Include="**\*.xaml" Exclude="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </Page>
    <Compile Update="**\*.xaml.cs" SubType="Code" DependentUpon="%(Filename)" />

    <!-- Resources -->
    <EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
    <Compile Update="Properties\Resources.Designer.cs" AutoGen="True" DependentUpon="Resources.resx" DesignTime="True" />

    <!-- Settings -->
    <None Update="Properties\Settings.settings" Generator="SettingsSingleFileGenerator" LastGenOutput="Settings.Designer.cs" />
    <Compile Update="Properties\Settings.Designer.cs" AutoGen="True" DependentUpon="Settings.settings" />

  </ItemGroup>

  <ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="System.Xaml" />
    <Reference Include="WindowsBase" />
  </ItemGroup>
</Project>

【讨论】:

  • 您的回答对我非常有用。就我而言,我遇到了 WPF 库的情况。所以我不得不删除 而不是将 OutputType 设置为 Exe。
  • 你应该使用&lt;Generator&gt;MSBuild:Compile&lt;/Generator&gt;而不是&lt;Generator&gt;MSBuild:UpdateDesignTimeXaml&lt;/Generator&gt;
  • 当这个项目结构时,当我编辑Settings.settings时,VS设计器不会重新生成Settings.Designer.cs。同样,运行自定义工具也没有效果。
  • 由于某种原因,当我构建我的项目时,生成的文件没有更新,每次更改任何 .XAML 时我都必须手动重新构建
  • 可能还需要为新 CPS 添加此解决方法。 github.com/dotnet/project-system/issues/2488
【解决方案2】:

经过一些搜索和反复试验,我得到了它的工作!

这是最终的 wpf csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <LanguageTargets>$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.CSharp.targets</LanguageTargets>
    <TargetFrameworks>net451</TargetFrameworks>
    <RootNamespace>MyWpfLibrary</RootNamespace>
    <AssemblyName>MyWpfLibrary</AssemblyName>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Rx-Xaml" Version="2.2.5" />
    <PackageReference Include="reactiveui-core" Version="7.2.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="MyOtherLibrary.csproj" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="ReachFramework" />
    <Reference Include="System.Net" />
    <Reference Include="System.Printing" />
    <Reference Include="System.Xaml" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
    <Compile Update="Properties\Resources.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Resources.resx"/>

    <Page Include="**\*.xaml" SubType="Designer" Generator="MSBuild:Compile" />
    <Compile Update="**\*.xaml.cs" SubType="Designer" DependentUpon="%(Filename)" />

    <Resource Include="Fonts\*.otf" />    
    <Resource Include="Images\*.png" />
  </ItemGroup>

  <Import Project="$(MSBuildSDKExtrasTargets)" Condition="Exists('$(MSBuildSDKExtrasTargets)')" />
</Project>

【讨论】:

  • 您是否尝试迁移 WPF 可执行项目?如果是这样,你是怎么做到的?我在编译时收到“未找到主要”错误。
  • @MarkOlbert 您需要设置build action of App.xaml。实际上,我已经列出了在 my question here 上完成这项工作所需要做的所有事情。
  • 知道如何为 Telerik 报告做同样的事情吗?我不确定用什么作为生成器。
【解决方案3】:

上述解决方案适用于 Wpf dll,但我将其还原,因为 Resharper 和 Visual Studio 设计器在此更改后不再起作用。主要是因为他们无法在设计时将 xaml 和代码隐藏配对。但是该项目可以编译并且可以工作。

对于 wpf 可执行文件,您需要执行以下操作:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <LanguageTargets>$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.CSharp.targets</LanguageTargets>
    <TargetFramework>net451</TargetFramework>
    <OutputType>WinExe</OutputType>
    <RootNamespace>MyNamespace</RootNamespace>
    <AssemblyName>MyExe</AssemblyName>
    <ApplicationIcon>MyExe.ico</ApplicationIcon>
    <ApplicationManifest>app.manifest</ApplicationManifest>
    <StartupObject>MyNamespace.App</StartupObject>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="System.Xaml" />
    <Reference Include="WindowsBase" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
    <Compile Update="Properties\Resources.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Resources.resx" />

    <None Update="Properties\Settings.settings" Generator="SettingsSingleFileGenerator" LastGenOutput="Settings.Designer.cs" />
    <Compile Update="Properties\Settings.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Settings.settings" />

    <Page Include="MainWindow.xaml" SubType="Designer" Generator="MSBuild:Compile" />
    <Compile Update="MainWindow.xaml.cs" DependentUpon="MainWindow.xaml" />
    <Resource Include="Images\*.png" />

    <ApplicationDefinition Include="App.xaml" SubType="Designer" Generator="XamlIntelliSenseFileGenerator" />
    <Compile Update="App.xaml.cs" DependentUpon="App.xaml" />
  </ItemGroup>

  <Import Project="$(MSBuildSDKExtrasTargets)" Condition="Exists('$(MSBuildSDKExtrasTargets)')" />
</Project>

【讨论】:

  • 谢谢,尼克。顺便说一句,对 LanguageTargets 和 MSBuildSDKExtrasTargets 的引用是什么意思?
  • 我认为 LanguageTargets 意味着它是 C# 而不是 VB.Net 或 F#,而且我猜 MSBuildSDKExtrasTargets 是 MSBuild 的东西。我还没有尝试删除它们以查看会发生什么:)
【解决方案4】:

Sunburst.NET.Sdk.WPF 允许将其用作 .NET SDK。这是 WPF 应用程序的完整示例,其中任何.cs.xaml 文件都将自动包含在中:

<Project Sdk="Sunburst.NET.Sdk.WPF/1.0.47">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net40</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="../WpfMath/WpfMath.csproj" />
  </ItemGroup>
</Project>

当您使用msbuild 构建这个项目时(值得注意的是,我没有使用dotnet build),它会自动从 NuGet 下载 SDK 并设置所有内容。

【讨论】:

  • 目前这确实是一个更好的解决方案。让我们等到 MS 发布对 Wpf 和 Winforms 的完全支持。
  • @FizxMike 我使用的是 MSBuild 15。
  • github 上的页面说Sdk="Sunburst.NET.Sdk.WPF" 但这只会给我带来错误。感谢带有完整版资格的提示Sdk="Sunburst.NET.Sdk.WPF/1.0.47"。 (github页面没有启用任何问题:()
  • @springy76 请参阅my answer,了解不使用 Sunburst SDK 的可能解决方案。
【解决方案5】:

上述解决方案可能不适用于 VS2019 上的 Xamarin.Platforms.WPF

这是一个为 .net 框架(不是 .net 核心应用程序)设计的项目(基于以前的答案),但可以处理 .net 标准依赖项:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <RootNamespace>TestWPF</RootNamespace>
    <AssemblyName>TestWPF</AssemblyName>
    <TargetFramework>net461</TargetFramework>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <Deterministic>true</Deterministic>        
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugType>full</DebugType>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugType>pdbonly</DebugType>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.Platforms" Version="3.0.0" />
    <PackageReference Include="Xamarin.Forms" Version="4.2.0.848062" />
    <PackageReference Include="Xamarin.Forms.Platform.WPF" Version="4.2.0.848062" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="WindowsBase" />
    <Reference Include="System.Xaml" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
    <Compile Update="Properties\Resources.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Resources.resx" />
    <None Update="Properties\Settings.settings" Generator="SettingsSingleFileGenerator" LastGenOutput="Settings.Designer.cs"/>
    <Compile Update="Properties\Settings.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Settings.settings" />

    <ApplicationDefinition Include="App.xaml" Generator="MSBuild:Compile" />
    <Page Include="**\*.xaml" Exclude="App.xaml" SubType="Designer" Generator="MSBuild:Compile" />
    <Compile Update="**\*.xaml.cs" SubType="Designer" DependentUpon="%(Filename)" />

    <EmbeddedResource Remove="**\*.xaml" />

  </ItemGroup>  
  <Import Project="$(MSBuildSDKExtrasTargets)" Condition="Exists('$(MSBuildSDKExtrasTargets)')" />
</Project>

【讨论】:

    【解决方案6】:

    现在 .NET Core 3 已经发布,如果可以的话,你应该使用它。

    但如果没有,我发现我可以仅为 XAML 项创建一个单独的共享项目,并且我可以从 SDK 样式的项目中引用该项目。一切正常。

    请注意,XAML 设计器不起作用 - 没有 Intellisense 或红色波浪线。 Visual Studio 使用 XML 编辑器打开 XAML 文件。

    【讨论】:

      【解决方案7】:

      使用官方更新工具来转换项目:

      dotnet tool install --global Project2015To2017.Migrate2019.Tool
      dotnet migrate-2019 wizard MyTestProject.csproj
      

      适用于项目和解决方案文件。更多信息here

      【讨论】:

      • 它不是官方的更新工具,而是由hvanbakel创建的。看起来合法且有前途,但使用风险自负。
      猜你喜欢
      • 1970-01-01
      • 2018-06-07
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多