Share via


從桌面應用程式移動至UWP

如果您有使用 .NET Framework 建置的現有桌面應用程式(包括 WPF 和 Windows Forms)或 C++ Win32 API,您有幾個移動至通用 Windows 平台 (UWP) 和 Windows 10/11 的選項。

把桌面應用程式封裝在 MSIX 套件中

您可以把桌面應用程式封裝在 MSIX 套件中,以存取更多 Windows 10 和 Windows 11 功能。 MSIX 是新式 Windows 應用程式套件格式,為所有 Windows 應用程式提供通用封裝體驗,包括 UWP、WPF、Windows Forms 及 Win32 應用程式。 將您的傳統型 Windows 應用程式封裝在 MSIX 套件中,可讓您存取強固的安裝和更新體驗、具有彈性功能系統的受控安全性模型、Microsoft Store 的支援、企業管理,以及許多自訂散發模型。 不論您有原始程式碼,還是只有現有安裝程式檔案(例如:MSI 或 App-V 安裝程式),您都可以封裝應用程式。 在您封裝應用程式後,您可以整合 UWP 功能,例如:套件擴充功能和其他 UWP 元件。

如需詳細資訊,請參閱從您的程式碼建置 MSIX 套件以及需要套件身分識別的功能

使用 Windows 執行階段 API

您可以在您的 WPF、Windows Forms 或 C++ Win32 傳統型應用程式中直接呼叫許多 Windows 執行階段 API,整合為 Windows 10 使用者帶來好處的新式體驗。 例如,您可以呼叫 Windows 執行階段 API 以將快顯通知新增至您的傳統型應用程式。

如需詳細資訊,請參閱在傳統型應用程式中使用 Windows 執行階段 API

把 .NET Framework 應用程式遷移至 UWP 應用程式

如果您的應用程式在 .NET Framework 上執行,您可以利用 .NET Standard 2.0 把其遷移至 UWP 應用程式。 盡可能把程式碼移動至 .NET Standard 2.0 類別庫,然後建立一個參考 .NET Standard 2.0 程式庫的 UWP 應用程式。

在 .NET Standard 2.0 程式庫中共用程序碼

如果您的應用程式在 .NET Framework 上執行,請把盡量把程式碼放入 .NET Standard 2.0 類別庫。 只要您的程式碼使用標準定義的 API,您就可以在 UWP 應用程式中重複使用。 在 .NET Standard 程式庫中共用程式碼變得比以往更輕而易舉,因為 .NET Standard 2.0 中包含更多 API。

以下影片會告訴您更多相關資訊。

新增 .NET Standard 程式庫

首先,把一或多個 .NET Standard 類別庫新增至您的解決方案。

Add dotnet standard project

您新增至解決方案的程式庫數量取決於您預計如何組織程序碼。

請確定每個類別庫都以 .NET Standard 2.0 為目標。

Target .NET Standard 2.0

您可以在類別庫專案的屬性頁中找到此設定。

從桌面應用程式專案,新增參考到類別庫專案。

Screenshot of the Solution Explorer pane that calls out the Class library reference for the dot NET project.

接下來,使用工具來判斷您的程序碼符合標準的程度。 如此一來,在您把程式碼移至程式庫前,您可以決定您可以重複使用哪些部分、哪些部分需要最少量的修改、及哪些部分會保持特定應用程式專用。

檢查程式庫和程式碼相容性

我們會從您自第三方取得的 Nuget 套件及其他 dll 檔案開始。

如果您的應用程式使用其中任何一種,請判斷它們是否與 .NET Standard 2.0 相容。 您可以使用 Visual Studio 擴充功能或命令列公用程式來執行此動作。

同樣利用這些工具來分析您的程序碼。 在這裡下載工具(dotnet-apiport),然後觀看這支影片,瞭解如何使用這些工具。  

如果您的程式碼與標準不相容,請考慮其他實作該程式碼的方式。 首先從開啟 .NET API 瀏覽器開始。 您可以使用該瀏覽器來檢閱 .NET Standard 2.0 中可用的 API。 請務必把清單的範圍設定為 .NET Standard 2.0。

dot net option

部分程式碼會是特定平台專用,而且必須保留在桌面應用程式專案中。

範例:把資料存取代碼遷移至 .NET Standard 2.0 程式庫

假設我們有一個非常基本的 Windows Forms 應用程式,可顯示來自 Northwind 範例資料庫的客戶。

Windows Forms App

該專案包含 .NET Standard 2.0 類別庫,其中包含名為 Northwind 的靜態類別。 如果我們把此程式碼移動至 Northwind 類別,則不會編譯,因為使用的是 SQLConnectionSqlCommandSqlDataReader 類別,以及 .NET Standard 2.0 中無法使用的類別。

public static ArrayList GetCustomerNames()
{
    ArrayList customers = new ArrayList();

    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString =
            @"Data Source=" +
            @"<Your Server Name>\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

        conn.Open();

        SqlCommand command = new SqlCommand("select ContactName from customers order by ContactName asc", conn);

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                customers.Add(reader[0]);
            }
        }
    }

    return customers;
}

不過我們可以使用 .NET API 瀏覽器 來尋找替代方案。 DbConnectionDbCommandDbDataReader 類別全都可在 .NET Standard 2.0 中使用,因此我們可以改用這些類別。

此修訂版會使用這些類別來取得客戶清單,但若要建立 DbConnection 類別,我們必須傳入我們在用戶端應用程式中建立的 Factory 物件。

public static ArrayList GetCustomerNames(DbProviderFactory factory)
{
    ArrayList customers = new ArrayList();

    using (DbConnection conn = factory.CreateConnection())
    {
        conn.ConnectionString = @"Data Source=" +
                        @"<Your Server Name>\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

        conn.Open();

        DbCommand command = factory.CreateCommand();
        command.Connection = conn;
        command.CommandText = "select ContactName from customers order by ContactName asc";

        using (DbDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                customers.Add(reader[0]);
            }
        }
    }

    return customers;
}

在 Windows Form 的程式碼後置頁面中,我們可以只建立 Factory 實例,並傳遞至我們的方法。

public partial class Customers : Form
{
    public Customers()
    {
        InitializeComponent();

        dataGridView1.Rows.Clear();

        SqlClientFactory factory = SqlClientFactory.Instance;

        foreach (string customer in Northwind.GetCustomerNames(factory))
        {
            dataGridView1.Rows.Add(customer);
        }
    }
}

建立 UWP 應用程式

現在您已準備好把 UWP 應用程式新增至您的解決方案。

desktop to UWP bridge image

您仍然需要在 XAML 中設計 UI 頁面,並撰寫任何特定裝置或平台專用程式碼,但當您完成時,您就能夠達到 Windows 10 和 Windows 11 裝置的完整範圍,而且您的應用程式頁面會有現代感,可以妥善適應不同螢幕大小和解析度。

您的應用程式還會回應除了鍵盤和滑鼠以外的輸入機制,而且在各裝置上的功能與設定都具有直覺性。 如此表示使用者在學習一次如何執行工作後,接著無論裝置為何,運作方式都十分類似。

這些只是 UWP 帶來的一些好處。 若要深入瞭解,請參閱 打造 Windows 的絕佳體驗

新增 UWP 專案

首先把 UWP 專案加入您的解決方案。

UWP Project

然後在 UWP 專案中,新增 .NET Standard 2.0 程式庫專案的參考。

Screenshot of the UWP Solution Explorer pane that calls out the reference to the Class library reference for the dot NET project.

打造頁面

新增 XAML 頁面並呼叫 .NET Standard 2.0 程式庫中的程序碼。

UWP app

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel x:Name="customerStackPanel">
        <ListView x:Name="customerList"/>
    </StackPanel>
</Grid>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        SqlClientFactory factory = SqlClientFactory.Instance;

        customerList.ItemsSource = Northwind.GetCustomerNames(factory);
    }
}

如要開始使用 UWP,請參閱 什麼是 UWP 應用程式

觸達 iOS 和 Android 裝置

您可以新增 Xamarin 專案來觸達 Android 和 iOS 裝置。

注意

針對全新跨平台專案,請考慮使用 .NET MAUI。

An image that shows an Android device and a i O S device displaying Xamarin apps.

這些專案可讓您使用 C# 來建置 Android 和 iOS 應用程式,並具備特定平台和特定裝置專用 API 的完整存取權限。 這些應用程式會利用特定平台專用的硬體加速,並針對原生效能而編譯。

他們可以存取基礎平台和裝置所公開的完整功能,包括 iBeacons 和 Android Fragments 等特定平台功能,而您會使用標準原生使用者介面控制項來建置具備使用者預期外觀和風格的 UI。

就像 UVP一樣,新增 Android 或 iOS 應用程式的成本較低,因為您可以在 .NET Standard 2.0 類別庫中重複使用商務規則。 您必須在 XAML 中設計 UI 頁面,並撰寫任何特定裝置或特定平台程式碼。

新增 Xamarin 專案

首先,把 AndroidiOS跨平台 專案新增至您的解決方案。

您可以在 Visual C# 群組底下的 [新增專案] 對話框中找到這些範本。

Screenshot of the Add New Project dialog box showing Installed > Visual C sharp selected and Android, Cross Platform, and i O S options called out.

注意

跨平台專案非常適合特定平台功能受限的應用程式。 您可以用來建置在 iOS、Android 和 Windows 上執行的原生 XAML 型 UI。 在這裡深入了解。

然後,在 Android、iOS 或跨平台專案中,新增類別庫專案的參考。

Screenshot of the Solution Explorer pane that calls out the reference to the Class library reference for the Android, i O S, or cross-platform project.

打造頁面

我們的範例顯示 Android 應用程式中的客戶清單。

Android app

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp" android:textSize="16sp"
    android:id="@android:id/list">
</TextView>
[Activity(Label = "MyAndroidApp", MainLauncher = true)]
public class MainActivity : ListActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SqlClientFactory factory = SqlClientFactory.Instance;

        var customers = (string[])Northwind.GetCustomerNames(factory).ToArray(typeof(string));

        ListAdapter = new ArrayAdapter<string>(this, Resource.Layout.list_item, customers);
    }
}

若要開始使用 Android、iOS 和跨平台專案,請參閱 Xamarin 開發人員入口網站

下一步

尋找您的問題解答

有任何疑問嗎? 請在 Stack Overflow 上發問。 我們的團隊會監視這些標籤。 您也可以在這裡發問。