共用方式為


從 .NET Framework 移轉至 .NET Core 的重大變更

如果您要將應用程式從 .NET Framework 移轉至 .NET Core 1.0 到 3.1 版,本文所列的重大變更可能會影響您。 重大變更會依類別分組,在這些類別中,依引進的 .NET Core 版本分組。

注意

本文不是 .NET Framework 與 .NET Core 之間重大變更的完整清單。 當我們發現有重大變更時,我們會在這裡新增最重要的變更。

Core .NET 程式庫

.NET 8

IDispatchImplAttribute API 已移除

.NET Core 2.1

UseShellExecute 的預設值變更

ProcessStartInfo.UseShellExecute .NET Core 上的預設值為 false。 在 .NET Framework 上,其預設值為 true

變更描述

Process.Start 可讓您直接啟動應用程式,例如,使用像 Process.Start("mspaint.exe") 這樣啟動 Paint 的程式代碼。 如果 ProcessStartInfo.UseShellExecute 設定為 true,它也可讓您間接啟動相關聯的應用程式。 在 .NET Framework 上,ProcessStartInfo.UseShellExecute 的預設值是 true,這表示如果您已與該編輯器 .txt 檔案相關聯,Process.Start("mytextfile.txt") 之類的程式代碼將會啟動記事本。 若要防止在 .NET Framework 上間接啟動應用程式,您必須明確地將 ProcessStartInfo.UseShellExecute 設定為 false。 在 .NET Core 上,ProcessStartInfo.UseShellExecute 的預設值為 false。 這表示當您呼叫 Process.Start時,不會啟動相關聯的應用程式。

System.Diagnostics.ProcessStartInfo 上的下列屬性只有在 ProcessStartInfo.UseShellExecutetrue時才能正常運作:

基於效能考慮,這項變更是在 .NET Core 中引進的。 一般而言,Process.Start 是用來直接啟動應用程式。 直接啟動程式不需要涉及 Windows 介面,並避免因而產生的效能開銷。 為了加快此預設案例的速度,.NET Core 會將 ProcessStartInfo.UseShellExecute 的預設值變更為 false。 如果需要,您可以選擇較慢的方式。

引進的版本

2.1

注意

在舊版 .NET Core 中,UseShellExecute 未針對 Windows 實作。

如果您的應用程式依賴舊的行為,請呼叫 Process.Start(ProcessStartInfo),並將 UseShellExecute 設定為 ProcessStartInfo 物件上的 true

類別

.NET Core 函式庫

受影響的 API


.NET Core 1.0

FileSystemInfo.Attributes 擲回的 UnauthorizedAccessException

在 .NET Core 中,當呼叫端嘗試設定檔案屬性值但沒有寫入許可權時,就會擲回 UnauthorizedAccessException

變更描述

在 .NET Framework 中,當呼叫端嘗試在 FileSystemInfo.Attributes 中設定檔案屬性值,但沒有寫入許可權時,就會擲回 ArgumentException。 在 .NET Core 中,會改為擲回 UnauthorizedAccessException。 (在 .NET Core 中,如果呼叫端嘗試設定無效的檔案屬性,仍然會擲回 ArgumentException

引進的版本

1.0

視需要修改任何 catch 語句,以攔截 UnauthorizedAccessException,而非 ArgumentException

類別

Core .NET 程式庫

受影響的 API


不支援處理損毀狀態的例外狀況

不支援在 .NET Core 中處理損毀的進程狀態例外狀況。

變更描述

先前,損壞的進程狀態例外可以透過受控代碼的例外狀況處理程式來攔截和處理,例如在 C# 中使用 try-catch 語句。

從 .NET Core 1.0 開始,Managed 程式代碼無法處理損毀的進程狀態例外狀況。 公共語言執行環境不會將損毀的進程狀態例外狀況傳遞給受控代碼。

引進的版本

1.0

藉由解決導致進程狀態損毀例外狀況的原因,來避免需要處理這些例外狀況。 如果絕對需要處理損毀的進程狀態例外狀況,請在 C 或 C++ 程式代碼中撰寫例外狀況處理程式。

類別

Core .NET 函式庫

受影響的 API


UriBuilder 屬性不再前面加上前置字元

UriBuilder.Fragment 不再在前面加上 # 字元,而且 UriBuilder.Query 如果已經有一個字元存在時,不再在前面加上 ? 字元。

變更描述

在 .NET Framework 中,UriBuilder.FragmentUriBuilder.Query 屬性一律會分別在所儲存的值前面加上 #? 個字元。 如果字串已經包含其中一個前置字元,此行為可能會導致預存值中的多個 #? 字元。 例如,UriBuilder.Fragment 的值可能會變成 ##main

從 .NET Core 1.0 開始,這些屬性不會再將 #? 字元加到已儲存的數值前面,如果它們已經在字串開頭出現的話。

引進的版本

1.0

設定屬性值時,您不再需要明確移除上述任何前置字元。 當您追加值時,這特別有用,因為每次追加的時候,您不再需要移除前置的 #?

例如,下列代碼段會顯示 .NET Framework 與 .NET Core 之間的行為差異。

var builder = new UriBuilder();
builder.Query = "one=1";
builder.Query += "&two=2";
builder.Query += "&three=3";
builder.Query += "&four=4";

Console.WriteLine(builder.Query);
  • 在 .NET Framework 中,輸出 ????one=1&two=2&three=3&four=4
  • 在 .NET Core 中,輸出 ?one=1&two=2&three=3&four=4

類別

Core .NET 程式庫

受影響的 API


Process.StartInfo 會針對您未啟動的進程擲回 InvalidOperationException

讀取非由您的程式碼啟動的行程的 Process.StartInfo 屬性會擲回 InvalidOperationException

變更描述

在 .NET Framework 中,存取程式代碼未啟動之進程的 Process.StartInfo 屬性會傳回虛擬 ProcessStartInfo 物件。 虛擬物件包含其所有屬性的預設值,但 EnvironmentVariables除外。

從 .NET Core 1.0 開始,如果您讀取您未啟動的進程 Process.StartInfo 屬性(也就是呼叫 Process.Start),則會擲回 InvalidOperationException

引進的版本

1.0

請勿存取程式代碼未啟動之進程的 Process.StartInfo 屬性。 例如,針對 Process.GetProcesses所傳回的進程,請勿讀取此屬性。

類別

Core .NET 程式庫

受影響的 API


密碼學

.NET Core 2.1

SignedCms.ComputeSignature 的布爾參數受到尊重

在 .NET Core 中,會遵守 SignedCms.ComputeSignature(CmsSigner, Boolean) 方法的 Boolean silent 參數。 如果此參數設定為 true,就不會顯示 PIN 提示。

變更描述

在 .NET Framework 中,會忽略 SignedCms.ComputeSignature(CmsSigner, Boolean) 方法的 silent 參數,而且提供者需要時一律會顯示 PIN 提示。 在 .NET Core 中,遵守 silent 參數的設定。如果設定為 true,即使提供者需要,也絕不會顯示 PIN 提示。

.NET Core 在版本 2.1 中引入了對 CMS/PKCS #7 訊息的支援。

引進的版本

2.1

為了確保必要時會出現 PIN 提示,傳統型應用程式應該呼叫 SignedCms.ComputeSignature(CmsSigner, Boolean),並將布爾參數設定為 false。 不論該處是否停用無訊息內容,產生的行為都與 .NET Framework 上的行為相同。

類別

密碼學

受影響的 API


MSBuild

.NET Core 3.0

資源清單檔案名稱變更

從 .NET Core 3.0 開始,在預設案例中,MSBuild 會為資源檔產生不同的指令清單檔名稱。

引進的版本

3.0

變更描述

在 .NET Core 3.0 之前,如果未為專案檔中的 EmbeddedResource 項目指定 LogicalNameManifestResourceNameDependentUpon 元數據,MSBuild 就會根據模式 <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources產生清單檔名稱。 如果未在專案檔中定義 RootNamespace,則會預設為項目名稱。 例如,在根項目目錄中名為 Form1.resx 的資源檔,其產生的指令清單名稱為 MyProject.Form1.resources

從 .NET Core 3.0 開始,如果資源檔與相同名稱的來源檔案共置(例如,Form1.resxForm1.cs),MSBuild 會使用來源檔案的類型資訊,在模式 <Namespace>.<ClassName>.resources中產生指令清單檔名稱。 命名空間和類別名稱是從同一來源檔案中的第一個類型所擷取。 例如,當名為 Form1.resx 的資源檔與名為 Form1.cs 的原始程式檔共置時,其產生的清單名稱為 MyNamespace.Form1.resources。 要注意的重點是,檔名的第一個部分與舊版 .NET Core 不同(MyNamespace,而不是 MyProject)。

注意

如果您在項目檔 EmbeddedResource 專案上指定了 LogicalNameManifestResourceNameDependentUpon 元數據,則這項變更不會影響該資源檔。

這項重大變更是在將 EmbeddedResourceUseDependentUponConvention 屬性新增至 .NET Core 專案時引進的。 根據預設,資源檔不會明確列在 .NET Core 項目檔中,因此它們沒有 DependentUpon 元數據來指定如何命名產生的 .resources 檔案。 當 EmbeddedResourceUseDependentUponConvention 設定為 true時,這是預設值,MSBuild 會尋找共置的來源檔案,並從該檔案擷取命名空間和類別名稱。 如果您將 EmbeddedResourceUseDependentUponConvention 設定為 false,MSBuild 會根據先前的行為產生對應的檔案名稱,這會結合 RootNamespace 和相對檔案路徑。

在大部分情況下,開發人員不需要採取任何動作,您的應用程式應該會繼續運作。 不過,如果這項變更中斷您的應用程式,您可以:

  • 變更程式代碼以預期新的清單名稱。

  • 在專案檔中將 EmbeddedResourceUseDependentUponConvention 設為 false,以退出新的命名規則。

    <PropertyGroup>
      <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
    </PropertyGroup>
    

類別

MSBuild

受影響的 API

N/A


聯網

.NET Core 2.0

WebClient.CancelAsync 不一定會立即取消

從 .NET Core 2.0 開始,如果回應已開始擷取,呼叫 WebClient.CancelAsync() 不會立即取消要求。

變更描述

先前,呼叫 WebClient.CancelAsync() 會立即取消請求。 從 .NET Core 2.0 開始,呼叫 WebClient.CancelAsync() 只會在回應尚未開始擷取時立即取消要求。 如果回應已開始擷取,則只有在完整讀取回應後才會取消請求。

此變更已實作,因為 WebClient API 已被取代,而改用 HttpClient

引進的版本

2.0

使用 System.Net.Http.HttpClient 類別,而不是 System.Net.WebClient,此類別已被取代。

類別

聯網

受影響的 API


Windows Forms

Windows Forms 支援已在 3.0 版中新增至 .NET Core。 如果您要將 Windows Forms 應用程式從 .NET Framework 移轉至 .NET Core,此處列出的重大變更可能會影響您的應用程式。

.NET Core 3.1

已移除的控制項

從 .NET Core 3.1 開始,部分 Windows Forms 控件已無法使用。

變更描述

從 .NET Core 3.1 開始,就無法再使用各種 Windows Forms 控件。 .NET Framework 2.0 引進了具有更佳設計和支援的取代控件。 已被取代的控制項先前已從設計工具工具箱中移除,但仍可供使用。

下列型態已無法使用:

已引入的版本

3.1

每個移除的控制件都有建議的取代控制件。 請參閱下表:

已移除控制件 (API) 建議替換 已移除的相關聯 API
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell、DataGridRow、 DataGridTableCollection、DataGridColumnCollection、DataGridTableStyle、DataGridColumnStyle、DataGridLineStyle、DataGridParentRowsLabel、DataGridParentRowsLabelStyle、DataGridBoolColumn、DataGridTextBox、GridColumnStylesCollection、GridTableStylesCollection、HitTestType
主選單 MenuStrip
選單 ToolStripDropDown、ToolStripDropDownMenu 選單項目集合
選單項目 ToolStripMenuItem(工具列選單項目)
工具列 工具列 (ToolStrip) 工具列外觀
工具列按鈕 工具列按鈕 ToolBarButtonClickEventArgs、ToolBarButtonClickEventHandler、ToolBarButtonStyle、ToolBarTextAlign

類別

Windows Forms

受影響的 API


如果顯示了工具提示,將不會觸發 CellFormatting 事件。

DataGridView 現在在以滑鼠懸停或透過鍵盤選取時,會顯示儲存格的文字和錯誤提示工具。 如果出現工具提示,則不會引發 DataGridView.CellFormatting 事件。

變更描述

在 .NET Core 3.1 之前,將 ShowCellToolTips 屬性設定為 trueDataGridView,在滑鼠懸停於儲存格時顯示儲存格文字與錯誤的工具提示。 當透過鍵盤選取儲存格時,不會顯示工具提示(例如,使用 Tab 鍵、快速鍵或箭頭流覽)。 如果使用者編輯儲存格,然後在 DataGridView 仍處於編輯模式時,將滑鼠停留在未設定 ToolTipText 屬性的單元格上,就會引發 CellFormatting 事件來格式化單元格的文字以在儲存格中顯示。

從 .NET Core 3.1 開始,為了符合無障礙標準,ShowCellToolTips 屬性設定為 trueDataGridView,將在單元格懸停時和透過鍵盤選取時,顯示單元格文字及錯誤的工具提示。 由於這項變更,當 DataGridView 處於編輯模式時,沒有 ToolTipText 屬性集的單元格暫留時,CellFormatting 事件 不會 引發。 不會引發事件,因為懸停單元格的內容會顯示為工具提示,而不是顯示在儲存格中。

引進的版本

3.1

DataGridView 處於編輯模式時,重構相依於 CellFormatting 事件的任何程序代碼。

類別

Windows Forms

受影響的 API

沒有


.NET Core 3.0

默認控件字型已變更為 Segoe UI 9 pt

變更描述

在 .NET Framework 中,Control.DefaultFont 屬性設定為 Microsoft Sans Serif 8.25 pt。 下圖顯示使用預設字型的視窗。

.NET Framework 中的預設控件字型

從 .NET Core 3.0 開始,預設字型會設定為 Segoe UI 9 pt (與 SystemFonts.MessageBoxFont相同的字型)。 由於這項變更,表單和控制項的大小增加約 27%,以適應新預設字型較大的尺寸。 例如:

.NET Core 中的預設控件字型

這項變更是為了符合 Windows 用戶體驗指導方針

推出的版本

3.0

由於表單和控件的大小有所變更,因此請確定您的應用程式正確呈現。

若要保留單一表體的原始字型,請將預設字型設定為 Microsoft Sans Serif 8.25 pt。 例如:

public MyForm()
{
    InitializeComponent();
    Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}

或者,您可以透過下列其中一種方式來變更整個應用程式的預設字型:

  • ApplicationDefaultFont MSBuild 屬性設定為 「Microsoft Sans Serif, 8.25pt」。。 這是慣用的技術,因為它允許 Visual Studio 在設計工具中使用新的設定。

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • 藉由呼叫 Application.SetDefaultFont(Font)

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f));
            Application.Run(new Form1());
        }
    }
    

類別

  • Windows Forms

受影響的 API

沒有。


FolderBrowserDialog 的現代化

適用於 .NET Core 的 Windows Forms 應用程式中的 FolderBrowserDialog 控制項已變更。

變更描述

在 .NET Framework 中,Windows forms 會針對 FolderBrowserDialog 控件使用下列對話框:

.NET Framework 中的 FolderBrowserDialogControl

在 .NET Core 3.0 中,Windows Forms 使用 Windows Vista 中引進的較新 COM 型控件:

.NET Core 中的 FolderBrowserDialogControl

引進的版本

3.0

對話框會自動升級。

如果您想要保留原始對話框,請在顯示對話方塊之前,將 FolderBrowserDialog.AutoUpgradeEnabled 屬性設定為 false,如下列代碼段所示:

var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();

類別

Windows Forms

受影響的 API


在某些 Windows Forms 類型中移除了 SerializableAttribute

SerializableAttribute 已從某些沒有已知二進位串行化案例的 Windows Forms 類別中移除。

變更描述

下列類型在 .NET Framework 中會使用 SerializableAttribute 裝飾,但在 .NET Core 中已移除此屬性:

從歷史上看,這種串行化機制有嚴重的維護和安全性考慮。 在維護 SerializableAttribute 的型別時,表示必須針對這些型別進行版本間的序列化變更測試,以及可能存在的架構間序列化變更測試。 這會使這些類型更難發展,而且維護成本很高。 這些類型沒有已知的二進位串行化案例,可將移除屬性的影響降到最低。

如需詳細資訊,請參閱 二進位串行化

引進的版本

3.0

更新任何依賴於標示為可序列化的類型的代碼。

類別

Windows Forms

受影響的 API

  • 沒有

不支援 AllowUpdateChildControlIndexForTabControls 相容性切換

.NET Framework 4.6 和更新版本的 Windows Forms 支援 Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls 兼容性開關,但 .NET Core 或 .NET 5.0 和更新版本不支援。

變更描述

在 .NET Framework 4.6 和更新版本中,選取索引卷標會重新排序其控件集合。 Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls 相容性參數可讓應用程式在不需要此行為時略過此重新排序。

在 .NET Core 和 .NET 5.0 及更高版本中,不支援 Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls 開關。

引進的版本

3.0

移除開關。 此開關不受支持,也沒有可用的替代功能。

類別

Windows Forms

受影響的 API

  • 沒有

不支援 DomainUpDown.UseLegacyScrolling 相容性切換

.NET Framework 4.7.1 引入的 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 相容性開關不支援在 .NET Core 或 .NET 5.0 及更高版本中的 Windows Forms。

變更描述

從 .NET Framework 4.7.1 開始,Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 相容性參數可讓開發人員選擇不啟用獨立 DomainUpDown.DownButton()DomainUpDown.UpButton() 動作。 設定還原了舊版行為,即如果存在內容文字,則忽略 DomainUpDown.UpButton(),且開發人員必須在控件上先使用 DomainUpDown.DownButton() 動作,再執行 DomainUpDown.UpButton() 動作。 如需詳細資訊,請參閱 <AppContextSwitchOverrides> 元素

在 .NET Core 和 .NET 5.0 及之後的版本中,不支援 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 開關。

引進的版本

3.0

拿掉開關。 不支持該開關,且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DoNotLoadLatestRichEditControl 相容性開關

在 .NET Framework 4.7.1 中引入的 Switch.System.Windows.Forms.UseLegacyImages 兼容性參數,不支援於 .NET Core 或 .NET 5.0 和更新版本中的 Windows Forms。

變更描述

在 .NET Framework 4.6.2 和舊版中,RichTextBox 控件會具現化 Win32 RichEdit 控件 v3.0,而針對以 .NET Framework 4.7.1 為目標的應用程式,RichTextBox 控件會具現化 RichEdit v4.1 (在 msftedit.dll中)。 引進了 Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl 相容性參數,以允許以 .NET Framework 4.7.1 和更新版本為目標的應用程式退出新的 RichEdit v4.1 控件,並改用舊的 RichEdit v3 控件。

在 .NET Core 和 .NET 5.0 及以後的版本中,不支援 Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl 開關。 僅支援新版本的 RichTextBox 控件。

引進的版本

3.0

拿掉開關。 不支持該開關,且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DoNotSupportSelectAllShortcutInMultilineTextBox 相容性參數

.NET Framework 4.6.1 中引進的 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 兼容性參數,在 .NET Core 和 .NET 5.0 和更新版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.6.1 開始,在 TextBox 控制項中,選取 Ctrl + A 這組快捷鍵會選取所有文字。 在 .NET Framework 4.6 和舊版中,如果將 Textbox.ShortcutsEnabledTextBox.Multiline 屬性都設為 true,則選擇快捷鍵 Ctrl + A 會無法選取所有文字。 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 兼容性開關是在 .NET Framework 4.6.1 中引入,以保留原本行為。 如需詳細資訊,請參閱 TextBox.ProcessCmdKey

在 .NET Core 與 .NET 5.0 及更新版本中,不支援 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 開關。

引進的版本

3.0

移除開關。 不受支持的開關,且沒有可用的替代功能。

類別

Windows Forms

受影響的 API

  • 沒有

不支援 DontSupportReentrantFilterMessage 相容性切換

.NET Framework 4.6.1 中引進的 Switch.System.Windows.Forms.DontSupportReentrantFilterMessage 兼容性參數,在 .NET Core 和 .NET 5.0 和更新版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.6.1 開始,Switch.System.Windows.Forms.DontSupportReentrantFilterMessage 相容性參數會在使用自定義 IMessageFilter.PreFilterMessage 實作呼叫 Application.FilterMessage 訊息時,解決可能的 IndexOutOfRangeException 例外狀況。 如需詳細資訊,請參閱 風險降低:自定義 IMessageFilter.PreFilterMessage 實作

在 .NET Core 和 .NET 5.0 及更高版本中,不支援 Switch.System.Windows.Forms.DontSupportReentrantFilterMessage 開關。

推出的版本

3.0

拿掉開關。 不支持該切換,並且沒有其他可用的功能。

類別

Windows Forms

受影響的 API


不支援 EnableVisualStyleValidation 相容性開關

.NET Core 或 .NET 5.0 及更新版本的 Windows Forms 不支援 Switch.System.Windows.Forms.EnableVisualStyleValidation 兼容性開關。

變更描述

在 .NET Framework 中,Switch.System.Windows.Forms.EnableVisualStyleValidation 兼容性參數允許應用程式選擇不驗證以數值形式提供的視覺樣式。

在 .NET Core 和 .NET 5.0 及更高的版本中,不支援 Switch.System.Windows.Forms.EnableVisualStyleValidation 開關。

推出的版本

3.0

移除開關。 開關不被支持,並且沒有可用的替代功能。

類別

Windows Forms

受影響的 API

  • 沒有

不支援 UseLegacyContextMenuStripSourceControlValue 相容性切換

.NET Framework 4.7.2 中引進的 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue 兼容性參數在 .NET Core 或 .NET 5.0 和更新版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.7.2 開始,Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue 兼容性切換可讓開發人員退出 ContextMenuStrip.SourceControl 屬性的新行為,而該屬性現在會傳回對來源控制的參考。 該屬性先前的行為是回傳 null。 如需詳細資訊,請參閱 <AppContextSwitchOverrides> 元素

在 .NET Core 和 .NET 5.0 及更新版本中,不支援 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue 開關。

引進的版本

3.0

移除開關。 該開關不受支持,且沒有其他可用的功能。

類別

Windows Forms

受影響的 API


不支援 UseLegacyImages 相容性切換

.NET Framework 4.8 中引進的 Switch.System.Windows.Forms.UseLegacyImages 相容性參數在 .NET Core 或 .NET 5.0 和更新版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.8 開始,Switch.System.Windows.Forms.UseLegacyImages 兼容性參數解決了在高 DPI 環境中 ClickOnce 案例中可能發生的影像縮放問題。 當設定為 true時,參數可讓用戶在縮放比例設定為大於 100%的高 DPI 顯示器上還原舊版影像縮放比例。 如需詳細資訊,請參閱 GitHub 上的 .NET Framework 4.8 版本資訊

在 .NET Core 和 .NET 5.0 及其後續版本中,不支援 Switch.System.Windows.Forms.UseLegacyImages 開關。

引進的版本

3.0

移除開關。 不支持此開關,並且沒有替代功能。

類別

Windows Forms

受影響的 API

  • 沒有

About 和 SplashScreen 範本已損壞

Visual Studio 所產生的 About.vbSplashScreen.vb 檔案包含在 .NET Core 3.0 和 3.1 中無法使用的 My 命名空間類型的參考。

引進的版本

3.0

更改描述

.NET Core 3.0 和 3.1 不包含完整的 Visual Basic My 支援。 關於啟動畫面 Visual Studio 中用於 Visual Basic 的 Windows Forms 應用程式窗體範本,參考了 My.Application.Info 類型中並不存在的屬性。

.NET 5 已改善 Visual Basic My 支援,將您的項目升級至 .NET 5 或更新版本。

-或-

修正應用程式中 AboutSplashScreen 類型中的編譯程式錯誤。 使用 System.Reflection.Assembly 類別來取得 My.Application.Info 類型所提供的資訊。 這裡提供這兩種形式的直接移植。

提示

這是範例程式代碼和未優化。 應該快取屬性清單,以便減少表單載入時間。

關於

Imports System.Reflection

Public NotInheritable Class About

    Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Set the title of the form.
        Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(applicationTitle) Then
            applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        Me.Text = String.Format("About {0}", applicationTitle)
        ' Initialize all of the text displayed on the About Box.
        ' TODO: Customize the application's assembly information in the "Application" pane of the project
        '    properties dialog (under the "Project" menu).
        Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
        Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
        Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
        Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
        Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
    End Sub

    Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
        Me.Close()
    End Sub

End Class

SplashScreen

Imports System.Reflection

Public NotInheritable Class SplashScreen

    Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Set up the dialog text at runtime according to the application's assembly information.  

        'TODO: Customize the application's assembly information in the "Application" pane of the project
        '  properties dialog (under the "Project" menu).

        'Application title
        Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(appTitle) Then
            appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        ApplicationTitle.Text = appTitle

        Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version

        'Format the version information using the text set into the Version control at design time as the
        '  formatting string.  This allows for effective localization if desired.
        '  Build and revision information could be included by using the following code and changing the
        '  Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar.  See
        '  String.Format() in Help for more information.
        '
        '    Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)

        Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)

        'Copyright info
        Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
    End Sub

End Class

類別

Visual Basic Windows Forms

受影響的 API

沒有


Microsoft.VisualBasic.ApplicationServices 命名空間中的類型無法使用

Microsoft.VisualBasic.ApplicationServices 命名空間中的類型無法使用。

引進的版本

.NET Core 3.0

變更描述

Microsoft.VisualBasic.ApplicationServices 命名空間中的類型可在 .NET Framework 中使用。 它們不適用於 .NET Core 3.0 - 3.1。

已移除類型,以避免後續版本中不必要的組件相依性或重大變更。

此命名空間已在 .NET 5 中新增,將您的項目升級至 .NET 5 或更新版本。

-或-

如果您的程式代碼相依於使用 Microsoft.VisualBasic.ApplicationServices 型別及其成員,您可能可以在 .NET 類別庫中使用對應的類型或成員。 例如,某些 System.EnvironmentSystem.Security.Principal.WindowsIdentity 成員提供對等功能給 Microsoft.VisualBasic.ApplicationServices.User 類別的屬性。

類別

Visual Basic

受影響的 API


Microsoft.VisualBasic.Devices 命名空間中的類型無法使用

Microsoft.VisualBasic.Devices 命名空間中的類型無法使用。

引進的版本

.NET Core 3.0

變更描述

Microsoft.VisualBasic.Devices 命名空間中的類型可在 .NET Framework 中使用。 它們不適用於 .NET Core 3.0 - 3.1。

已移除組件類型,以避免後續版本中不必要的組件相依性或重大變更。

此命名空間已在 .NET 5 中新增,將您的項目升級至 .NET 5 或更新版本。

-或-

如果您的程式代碼相依於使用 Microsoft.VisualBasic.Devices 型別及其成員,您可能可以在 .NET 類別庫中使用對應的類型或成員。 例如,與 Microsoft.VisualBasic.Devices.Clock 類別相等的功能是由 System.DateTimeSystem.Environment 型別所提供,而 Microsoft.VisualBasic.Devices.Ports 類別的對等功能是由 System.IO.Ports 命名空間中的型別所提供。

類別

Visual Basic

受影響的 API


Microsoft.VisualBasic.MyServices 命名空間中的類別無法使用

Microsoft.VisualBasic.MyServices 命名空間中的類型無法使用。

引進的版本

.NET Core 3.0

變更描述

Microsoft.VisualBasic.MyServices 命名空間中的類型可在 .NET Framework 中使用。 它們不適用於 .NET Core 3.0 - 3.1。

已移除類型,以避免後續版本中不必要的元件相依性或重大變更。

此命名空間已在 .NET 5 中新增,將您的項目升級至 .NET 5 或更新版本。

-或-

如果您的程式代碼取決於使用 Microsoft.VisualBasic.MyServices 類型和其成員,.NET 類別庫中會有對應的類型和成員。 以下是 Microsoft.VisualBasic.MyServices 類型與其對等 .NET 類別庫類型的對應:

Microsoft.VisualBasic.MyServices 類型 .NET 類別庫類型
ClipboardProxy 適用於 WPF 應用程式的 System.Windows.Clipboard,適用於 Windows Forms 應用程式的 System.Windows.Forms.Clipboard
FileSystemProxy System.IO 命名空間中的類型
RegistryProxy Microsoft.Win32 命名空間中的登錄相關類型
SpecialDirectoriesProxy Environment.GetFolderPath

類別

Visual Basic

受影響的 API


另請參閱