從 .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 可讓您使用啟動 Paint 的 Process.Start("mspaint.exe") 之類的程式碼直接啟動應用程式。 如果 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 時,預設不會啟動相關聯的應用程式。

只有在 ProcessStartInfo.UseShellExecutetrue 時,System.Diagnostics.ProcessStartInfo 上的下列屬性才有作用:

基於效能考量,.NET Core 中已引入此變更。 一般而言,Process.Start 用來直接啟動應用程式。 直接啟動應用程式不需要涉及 Windows 殼層並產生相關聯的效能成本。 為了加快此預設案例的速度,.NET Core 將 ProcessStartInfo.UseShellExecute 的預設值變更為 false。 如有需要,您可以選擇加入較慢的路徑。

導入的版本

2.1

注意

舊版的 .NET Core 並未針對 Windows 實作 UseShellExecute

如果您的應用程式依賴舊行為,請使用在 ProcessStartInfo 物件設定為 trueUseShellExecute 呼叫 Process.Start(ProcessStartInfo)

類別

Core .NET 程式庫

受影響的 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 開始,受控程式碼無法處理損毀的流程狀態例外狀況。 通用語言執行平台不會將損毀的流程狀態例外狀況傳遞給受控程式碼。

導入的版本

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) 方法使用布林值 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),並將 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.cs 的來源檔案共置而且名為 Form1.resx 的資源檔,產生的資訊清單名稱是 MyNamespace.Form1.resources。 請注意,檔案名稱的第一個部分不同於舊版 .NET Core (MyNamespace 而非 MyProject)。

注意

如果您在專案檔中的 EmbeddedResource 項目上指定 LogicalNameManifestResourceNameDependentUpon 中繼資料,則這項變更不會影響該資源檔。

此中斷性變更是透過將 EmbeddedResourceUseDependentUponConvention 屬性新增至 .NET Core 專案而進行。 根據預設,資源檔不會明確列在 .NET Core 專案檔中,因此沒有 DependentUpon 中繼資料可指定如何命名產生的 .resources 檔案。 EmbeddedResourceUseDependentUponConvention 設定為 true 時,這是預設值,MSBuild 會尋找共置的來源檔案,並從該檔案擷取命名空間和類別名稱。 如果您設定 EmbeddedResourceUseDependentUponConventionfalse,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() 才會立即取消要求。 若回應已開始擷取,則只有在讀取完整回應後,才會取消要求。

由於 HttpClient 已取代 WebClient API,因此本變更已實作。

導入的版本

2.0

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

類別

網路

受影響的 API


Windows Forms

已將 Windows Forms 支援新增至 .NET Core 3.0 版。 如果您要將 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
MainMenu MenuStrip
功能表 ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
MenuItem ToolStripMenuItem
ToolBar ToolStrip ToolBarAppearance
ToolBarButton ToolStripButton 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 使用者體驗 (UX) 指導方針一致。

導入的版本

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 的現代化

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

變更描述

在 .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

已從沒有已知二進位序列化案例的一些 Windows Forms 類別中移除 SerializableAttribute

變更描述

在 .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 Core 或 .NET 5.0 與更新版本上的 Windows Forms 不支援 .NET Framework 4.7.1 中引進的 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 相容性參數。

變更描述

從 .NET Framework 4.7.1 開始,Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 相容性參數可讓開發人員退出獨立 DomainUpDown.DownButton()DomainUpDown.UpButton() 動作。 參數已還原舊版行為,如果內容文字存在,則會忽略 DomainUpDown.UpButton(),而且開發人員必須在 DomainUpDown.UpButton() 動作之前使用控制項上的 DomainUpDown.DownButton() 動作。 如需詳細資訊,請參閱 <AppContextSwitchOverrides> 元素

在 .NET Core 和 .NET 5.0 與更新版本中,不支援 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 參數。

導入的版本

3.0

移除參數。 不支援參數,而且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DoNotLoadLatestRichEditControl 相容性參數

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

變更描述

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

在 .NET Core 和 .NET 5.0 與更新版本中,不支援 Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl 參數。 僅支援新版本的 RichTextBox 控制項。

導入的版本

3.0

移除參數。 不支援參數,而且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DoNotSupportSelectAllShortcutInMultilineTextBox 相容性參數

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

變更描述

從 .NET Framework 4.6.1 開始,選取 TextBox 控制項中的 Ctrl + A 快速鍵會選取所有文字。 在 .NET Framework 4.6 和舊版中,如果 Textbox.ShortcutsEnabledTextBox.Multiline 屬性都設定為 true,則選取 Ctrl + A 快速鍵無法選取所有文字。 .NET Framework 4.6.1 引進 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 相容性參數,以保留原始行為。 如需詳細資訊,請參閱:TextBox.ProcessCmdKey

在 .NET Core 和 .NET 5.0 與更新版本中,不支援 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 參數。

導入的版本

3.0

移除參數。 不支援參數,而且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DontSupportReentrantFilterMessage 相容性參數

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

變更描述

從 .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 Core 或 .NET 5.0 與更新版本上的 Windows Forms 不支援 .NET Framework 4.7.2 中引進的 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue 相容性參數。

變更描述

從 .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 Core 或 .NET 5.0 與更新版本上的 Windows Forms 不支援 .NET Framework 4.8 中引進的 Switch.System.Windows.Forms.UseLegacyImages 相容性參數。

變更描述

從 .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 for Visual Basic Windows Forms 應用程式中的 AboutSplashScreen 表單範本參考型別中 My.Application.Info 無法使用的屬性。

Visual Basic My 支援已在 .NET 5 中改善,將您的專案升級至 .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 System.Windows.Clipboard 適用於 WPF 應用程式,System.Windows.Forms.Clipboard 適用於 Windows Forms 應用程式
FileSystemProxy System.IO 命名空間中的型別
RegistryProxy Microsoft.Win32 命名空間中的登錄相關型別
SpecialDirectoriesProxy Environment.GetFolderPath

類別

Visual Basic

受影響的 API


另請參閱