將傳統 WPF 程式遷移到 DotNetCore 3.0

来源:https://www.cnblogs.com/hippieZhou/archive/2019/04/11/10661181.html
-Advertisement-
Play Games

介紹 由於歷史原因,基於 Windows 平臺存在著大量的基於 .NetFramework 開發的 WPF 和 WinForm 相關程式,如果將這些程式全部基於 DotNetCore 3.0 重寫一遍顯然是不現實的,但是 DotNetCore 是未來發展的趨勢。所以本文通過以 WPF 為例,介紹一下 ...


介紹

由於歷史原因,基於 Windows 平臺存在著大量的基於 .NetFramework 開發的 WPFWinForm 相關程式,如果將這些程式全部基於 DotNetCore 3.0 重寫一遍顯然是不現實的,但是 DotNetCore 是未來發展的趨勢。所以本文通過以 WPF 為例,介紹一下如何將傳統 WPF 遷移到 DotNetCore 3.0 上。

環境

我在之前的一篇文章 DotNetCore 3.0 助力 WPF 開發 有提到過,如果想開發基於 DotNetCore 3.0WPF 程式,我們需要安裝 Visual Studio 2019DotNetCore 3.0 SDK,這兩個條件是必須具備的。同樣的,我們做框架遷移,這兩個條件同樣也是必須的。

註:為了不必要的麻煩,建議使用 Visual Studio 2019 來進行遷移工作。

實驗

首先,我們通過 Visual Studio 2019 創建一個傳統的基於 .NetFramework 的 WPF 程式。如下圖所示:

項目創建完成之後,你會發現還是那個屬性的味道,沒有什麼變化。嘗試編譯運行,也是沒什麼問題。

更新 NuGet

在做遷移之前,我們需要確認一下我們的項目是否引用了 NuGet 上的一些包,如果引用了,請務必更新至最新版本。雖然這不是必須的,但是卻是有必要的,避免在遷移過程中出現一些未知錯誤。

這裡,我引用一下 Newtonsoft.Json 作為示例。在 MainWindow.xaml.cs 中嘗試使用

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    protected override void OnContentRendered(EventArgs e)
    {
        var user = new User { Name = "hippieZhou", Eamil = "[email protected]" };
        var json = Newtonsoft.Json.JsonConvert.SerializeObject(user);
        Trace.WriteLine(json);

        base.OnContentRendered(e);
    }
}

public class User
{
    public string Name { get; set; }
    public string Eamil { get; set; }
}

編譯運行程式,可以正常編譯運行和執行。控制台也輸出了 User 對象也能正確序列化。

使用 Portability Analyzer

.NET Portability Analyzer 工具是用於檢測我們當前的 WPF 程式中使用的所有 API 是否支持遷移到 DotNetCore 3.0 上。運行該工具後如下圖所示:

點擊 Browser 按鈕,將我們的項目目錄載入進來,之後點擊 Analyze,等分享完成之後,點擊 Open Report 即可查看檢測結果,如下圖所示:

從上圖中,我們可以看到,我們的程式當前的框架為 .NetFramework 4.7.2,當前使用的程式集 在 DotNetCore 3.0 受支持率為 100%,這就表明我們的程式可以無縫遷移到 DotNetCore 上了。

遷移 packages.config

如果我們的程式引用了 NuGet 上的包,那麼 VS 會為我們創建一個 packages.config,這個文件在 DotNetCore 中不受支持,所以我們需要將它修改為受支持的類型。

滑鼠右鍵它,然後點擊 Migrate packages.config to PackageReference 即可,如下圖所示:

遷移 XXX.csproj

這裡,我們修改我們示常式序中的 WpfApp1.csproj,在傳統的 .csproj 中會有一大堆配置,這些配置方式在 DotNetCore 中同樣不適用了。因此,我們需要將我們的內容修改一下,如下所示:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
  </ItemGroup>

</Project>

重新載入項目後,會如下圖所示:

接著,我們需要刪除掉項目中的 Properties,操作完畢後嘗試重新編譯運行,如果不出意外的話,應該是可以正常執行的。

最後,我們可以對比一下這種遷移後的項目結構和直接通過 DotNetCore 創建的項目結構之間的差別,如下圖所示:

總結

需要補充的一點是,目前在 VS2019 中創建 DotNetCore 3.0 的 WPF 項目時, XAML 的設計視圖還是不可用的狀態,所以這個需要註意一下。

DotNetCore 是未來發展的趨勢,由於目前還是預覽版,所以我們可以先試著做一些技術儲備,等待正式版出來後,我們就可以很快的遷移過來。

相關參考


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用 Python 獲取 B 站播放歷史記錄 最近 B 站出了一個年度報告,統計用戶一年當中在 B 站上觀看視頻的總時長和總個數。過去一年我居然在 B 站上看了2600+個視頻,總計251個小時,居然花了這麼多時間,嚇得我差點把 Bilibili App 卸載了... 然而我又很好奇,到底我在 B 站 ...
  • static可以修飾變數,修飾的變數直接屬於某各類,不局限於某個方法,無法在成員方法中修飾變數,也不可以在靜態方法中修飾變數。被static修飾的方法屬於靜態方法(類方法),與對象無關,與類有關。final可以修飾類、變數、方法,abstract可以修飾類,方法;final與abstract不能同時 ...
  • 1122. 音樂節拍 (Standard IO) 時間限制: 1000 ms 空間限制: 262144 KB 具體限制 1122. 音樂節拍 (Standard IO) 時間限制: 1000 ms 空間限制: 262144 KB 具體限制 1122. 音樂節拍 (Standard IO) 時間限制: ...
  • ChromeDriver版本支持的Chrome版本 v2.46 v72-74 v2.45 v71-73 v2.44 v70-72 v2.43 v69-71 v2.42 v68-70 v2.41 v67-69 v2.40 v66-68 v2.39 v66-68 v2.38 v65-67 v2.37 v ...
  • 今天老師講了一天狗跳樓的問題,昨天解開始說了,今天都沒講新課, 所以,今天自學了Scanner類及String的類型轉換 先來Scanner類實現鍵盤輸入功能: 代碼: package pkg1; import java.util.Scanner; public class Test{ public ...
  • 神奇的老師在網上看到狗跳樓的視頻然後就想到拋物線問題; 還是 屬性和方法的調用: package sklx; public class Dog{ private float v = 30.0f; private float g = 9.8f; //水平方向本質就是勻速直線運動 public floa ...
  • 一.概述 在物理層之間相互通信必須保護資源,需要實現身份驗證和授權,通常針對同一個用戶存儲。對於資源安全設計包括二個部分,一個是認證,一個是API訪問。 1 認證 認證是指:應用程式需要知道當前用戶的身份時,需要進行身份驗證,確定用戶是否有效。最常見的身份驗證協議是SAML2p,WS-Federat ...
  • 受微軟美女員工 Grace Peng 邀請(也可能是套路???),參加微軟神經語音(沒錯,就是神經)曉曉的試用,首先是看到了群裡面的消息,然後就是發送申請,等待回覆,過了幾天後,收到了一個機器人發來的賬號密碼,告訴我已經幫我申請了免費試用的賬號,直接登錄即可使用了。其實一直都有接觸各種 TTS 的服... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...