From 57a24d24e6dc1ce8124565c2bef71a72ef6e8618 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Tue, 29 Dec 2020 19:52:18 +0530 Subject: [PATCH 01/28] Updated content to net-5.0 --- ...migration-core.md => example-migration.md} | 94 +++++++++++-------- docs/architecture/modernize-desktop/index.md | 18 ++-- .../migrate-modern-applications.md | 56 +++++------ docs/architecture/modernize-desktop/toc.yml | 10 +- ...new-dotnet-core.md => whats-new-dotnet.md} | 36 ++++--- .../why-modern-applications.md | 24 ++--- .../modernize-desktop/windows-migration.md | 10 +- 7 files changed, 134 insertions(+), 114 deletions(-) rename docs/architecture/modernize-desktop/{example-migration-core.md => example-migration.md} (63%) rename docs/architecture/modernize-desktop/{whats-new-dotnet-core.md => whats-new-dotnet.md} (79%) diff --git a/docs/architecture/modernize-desktop/example-migration-core.md b/docs/architecture/modernize-desktop/example-migration.md similarity index 63% rename from docs/architecture/modernize-desktop/example-migration-core.md rename to docs/architecture/modernize-desktop/example-migration.md index 28efdb4788e63..2d5d9c4a668f3 100644 --- a/docs/architecture/modernize-desktop/example-migration-core.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -1,12 +1,12 @@ --- -title: Example of migrating to .NET Core 3.1 -description: Showing how to migrate a sample applications targeting .NET Framework to .NET Core 3.1. -ms.date: 05/12/2020 +title: Example of migrating to .NET +description: Showing how to migrate a sample applications targeting .NET Framework to .NET. +ms.date: 12/29/2020 --- -# Example of migrating to .NET Core 3.1 +# Example of migrating to .NET -In this chapter, we present practical guidelines to help you perform a migration of your existing application from .NET Framework to .NET Core. +In this chapter, we present practical guidelines to help you perform a migration of your existing application from .NET Framework to .NET. We present a well-structured process you can follow and the most important things to consider on each step. @@ -18,9 +18,9 @@ The migration process consists of four sequential steps: 1. **Preparation**: Understand the dependencies the project has to have an idea of what's ahead. In this step, you take the current project into a state that simplifies the startup point for the migration. -2. **Migrate Project File:** .NET Core projects use the new SDK-style project format. Create a new project file with this format or update the one you have to use the SDK style. +2. **Migrate Project File:** .NET projects use the new SDK-style project format. Create a new project file with this format or update the one you have to use the SDK style. -3. **Fix code and build:** Build the code in .NET Core addressing API-level differences between .NET Framework and .NET Core. If needed, update third-party packages to the ones that support .NET Core. +3. **Fix code and build:** Build the code in .NET addressing API-level differences between .NET Framework and .NET. If needed, update third-party packages to the ones that support .NET. 4. **Run and test:** There might be differences that don't show up until run time. So, don't forget to run the application and test that everything works as expected. @@ -28,47 +28,61 @@ The migration process consists of four sequential steps: #### Migrate packages.config file -In a .NET Framework application, all references to external packages are declared in the *packages.config* file. In .NET Core, there's no longer the need to use the *packages.config* file. Instead, use the [PackageReference](../../core/project-sdk/msbuild-props.md#packagereference) property inside the project file to specify the NuGet packages for your app. +In a .NET Framework application, all references to external packages are declared in the *packages.config* file. In .NET, there's no longer the need to use the *packages.config* file. Instead, use the [PackageReference](../../core/project-sdk/msbuild-props.md#packagereference) property inside the project file to specify the NuGet packages for your app. So, you need to transition from one format to another. You can do the update manually, taking the dependencies contained in the *packages.config* file and migrating them to the project file with the `PackageReference` format. Or, you can let Visual Studio do the work for you: right-click on the *packages.config* file and select the **Migrate packages.config to PackageReference** option. -#### Verify every dependency compatibility in .NET Core +#### Verify every dependency compatibility in .NET -Once you've migrated the package references, you must check each reference for compatibility. You can explore the dependencies of each NuGet package your application is using on [nuget.org](https://www.nuget.org/). If the package has .NET Standard dependencies, then it's going to work on .NET Core because .NET Core 3.1 [supports](../../standard/net-standard.md#net-implementation-support) all versions of .NET Standard. The following image shows the dependencies for the `Castle.Windsor` package: +Once you've migrated the package references, you must check each reference for compatibility. You can explore the dependencies of each NuGet package your application is using on [nuget.org](https://www.nuget.org/). If the package has .NET Standard dependencies, then it's going to work on .NET 5.0 because .NET [supports](../../standard/net-standard.md#net-implementation-support) all versions of .NET Standard. The following image shows the dependencies for the `Castle.Windsor` package: ![Screenshot of the NuGet dependencies for the Castle.Windsor package](./media/example-migration-core/nuget-dependencies.png) To check the package compatibility, you can use the tool that offers a more detailed information about versions and dependencies. -Maybe the project is referencing older package versions that don't support .NET Core, but you might find newer versions that do support it. So, updating packages to newer versions is generally a good recommendation. However, you should consider that updating the package version can introduce some breaking changes that would force you to update your code. +Maybe the project is referencing older package versions that don't support .NET, but you might find newer versions that do support it. So, updating packages to newer versions is generally a good recommendation. However, you should consider that updating the package version can introduce some breaking changes that would force you to update your code. -What happens if you don't find a compatible version? What if you just don't want to update the version of a package because of these breaking changes? Don't worry because it's possible to depend on .NET Framework packages from a .NET Core application. Don't forget to test it extensively because it can cause run-time errors if the external package calls an API that isn't available on .NET Core. This is great for when you're using an old package that isn't going to be updated and you can just retarget to work on the .NET Core. +What happens if you don't find a compatible version? What if you just don't want to update the version of a package because of these breaking changes? Don't worry because it's possible to depend on .NET Framework packages from a .NET application. Don't forget to test it extensively because it can cause run-time errors if the external package calls an API that isn't available on .NET. This is great for when you're using an old package that isn't going to be updated and you can just retarget to work on the .NET. #### Check for API compatibility -Since the API surface in .NET Framework and .NET Core is similar but not identical, you must check which APIs are available on .NET Core and which aren't. You can use the .NET Portability Analyzer tool to surface APIs used that aren't present on .NET Core. It looks at the binary level of your app, extracts all the APIs that are called, and then lists which APIs aren't available on your target framework (.NET Core 3.1 in this case). +Since the API surface in .NET Framework and .NET is similar but not identical, you must check which APIs are available on .NET and which aren't. You can use the .NET Portability Analyzer tool to surface APIs used that aren't present on .NET. It looks at the binary level of your app, extracts all the APIs that are called, and then lists which APIs aren't available on your target framework (.NET 5.0 in this case). You can find more information about this tool at: -An interesting aspect of this tool is that it only surfaces the differences from your own code and not code from external packages, which you can't change. Remember you should have updated most of these packages to make them work with .NET Core. +An interesting aspect of this tool is that it only surfaces the differences from your own code and not code from external packages, which you can't change. Remember you should have updated most of these packages to make them work with .NET. ### Migrate project file -#### Create the new .NET Core project +The easy way you can get started with the migration by using [Try Convert](https://github.com/dotnet/try-convert/releases). It's a global tool that attempts to upgrade your project file from the old style to the new SDK style and retargets applicable projects to .NET 5. Once it's installed, you can run the below commands: -In most of the cases, you'll want to update your existing project to the new .NET Core format. However, you can also create a new project while maintaining the old one. The main drawback from updating the old project is that you lose designer support, which may be important for you. If you want to keep using the designer, you must create a new .NET Core project in parallel with the old one and share assets. If you need to modify UI elements in the designer, you can switch to the old project to do that. And since assets are linked, they'll be updated in the .NET Core project as well. +```text +try-convert -p "" +``` + +Or: + +```text +try-convert -w "" +``` + +After the tool completes the conversion, reload your files in Visual Studio to run and test. There's a possibility that Try Convert won't be able to perform the conversion due to the specifics of your project. In that case, you can refer the below steps. -The [SDK-style project](../../core/project-sdk/msbuild-props.md) for .NET Core is a lot simpler than .NET Framework's project format. And apart from the previously mentioned `PackageReference` entries, you won't need to do much more. The new project format includes certain file extensions [by default](../../core/tools/csproj.md#default-compilation-includes-in-net-core-projects), such as `.cs` and `.xaml` files, without the need to explicitly include them in the project file. +#### Create the new .NET project + +In most of the cases, you'll want to update your existing project to the new .NET format. However, you can also create a new project while maintaining the old one. The main drawback from updating the old project is that you lose designer support, which may be important for you. If you want to keep using the designer, you must create a new .NET project in parallel with the old one and share assets. If you need to modify UI elements in the designer, you can switch to the old project to do that. And since assets are linked, they'll be updated in the .NET project as well. + +The [SDK-style project](../../core/project-sdk/msbuild-props.md) for .NET is a lot simpler than .NET Framework's project format. And apart from the previously mentioned `PackageReference` entries, you won't need to do much more. The new project format includes certain file extensions [by default](../../core/tools/csproj.md#default-compilation-includes-in-net-core-projects), such as `.cs` and `.xaml` files, without the need to explicitly include them in the project file. #### Assembly.info considerations -Attributes are autogenerated on .NET Core projects. If the project contains an *AssemblyInfo.cs* file, the definitions will be duplicated, which will cause compilation conflicts. You can delete the older *AssemblyInfo.cs* file or disable autogeneration by adding the following entry to the .NET Core project file: +Attributes are autogenerated on .NET projects. If the project contains an *AssemblyInfo.cs* file, the definitions will be duplicated, which will cause compilation conflicts. You can delete the older *AssemblyInfo.cs* file or disable autogeneration by adding the following entry to the .NET project file: ```xml - - + + false @@ -90,17 +104,17 @@ Update the versions of the packages you've found to be compatible, as shown in t #### Microsoft.Windows.Compatibility -If your application depends on APIs that aren't available on .NET Core, such as Registry, ACLs, or WCF, you have to include a reference to the `Microsoft.Windows.Compatibility` package to add these Windows-specific APIs. They work on .NET Core but aren't included as they aren't cross-platform. +If your application depends on APIs that aren't available on .NET, such as Registry, ACLs, or WCF, you have to include a reference to the `Microsoft.Windows.Compatibility` package to add these Windows-specific APIs. They work on .NET but aren't included as they aren't cross-platform. There's a tool called API Analyzer () that helps you identify APIs that aren't compatible with your code. #### Use \#if directives -If you need different execution paths when targeting .NET Framework and .NET Core, you should use compilation constants. Add some \#if directives to your code to keep the same code base for both targets. +If you need different execution paths when targeting .NET Framework and .NET, you should use compilation constants. Add some \#if directives to your code to keep the same code base for both targets. -#### Technologies not available on .NET Core +#### Technologies not available on .NET -Some technologies aren't available on .NET Core, such as: +Some technologies aren't available on .NET, such as: * AppDomains * Remoting @@ -108,15 +122,15 @@ Some technologies aren't available on .NET Core, such as: * WCF Server * Windows Workflow -That's why you need to find a replacement for these technologies if you're using them in your application. For more information, see the [.NET Framework technologies unavailable on .NET Core](../../core/porting/net-framework-tech-unavailable.md) article. +That's why you need to find a replacement for these technologies if you're using them in your application. For more information, see the [.NET Framework technologies unavailable on .NET Core and .NET 5+](../../core/porting/net-framework-tech-unavailable.md) article. #### Regenerate autogenerated clients -If your application uses autogenerated code, such as a WCF client, you may need to regenerate this code to target .NET Core. Sometimes, you can find some missing references since they may not be included as part of the default .NET Core assemblies set. Using a tool like , you can easily locate the assembly the missing reference lives in and add it from NuGet. +If your application uses autogenerated code, such as a WCF client, you may need to regenerate this code to target .NET. Sometimes, you can find some missing references since they may not be included as part of the default .NET assemblies set. Using a tool like , you can easily locate the assembly the missing reference lives in and add it from NuGet. #### Rolling back package versions -As a general rule, we've previously stated that you better update every single package version to be compatible with .NET Core. However, you can find that targeting an updated and compatible version of an assembly just doesn't pay off. If the cost of change isn't acceptable, you can consider rolling back package versions keeping the ones you use on .NET Framework. Although they may not be targeting .NET Core, they should work well unless they call some unsupported APIs. +As a general rule, we've previously stated that you better update every single package version to be compatible with .NET. However, you can find that targeting an updated and compatible version of an assembly just doesn't pay off. If the cost of change isn't acceptable, you can consider rolling back package versions keeping the ones you use on .NET Framework. Although they may not be targeting .NET, they should work well unless they call some unsupported APIs. ### Run and test @@ -126,9 +140,9 @@ In this final step, you can find several different issues depending on the compl For example, if you use configuration files (*app.config*), you may find some errors at run time like Configuration Sections not present. Using the `Microsoft.Extensions.Configuration` NuGet package should fix that error. -Another reason for errors is the use of the `BeginInvoke` and `EndInvoke` methods because they aren't supported on .NET Core. They aren't supported on .NET Core because they have a dependency on Remoting, which doesn't exist on .NET Core. To solve this issue, try to use the `await` keyword (when available) or the method. +Another reason for errors is the use of the `BeginInvoke` and `EndInvoke` methods because they aren't supported on .NET. They aren't supported on .NET because they have a dependency on Remoting, which doesn't exist on .NET. To solve this issue, try to use the `await` keyword (when available) or the method. -You can use compatibility analyzers to let you identify APIs and code patterns in your code that can potentially cause problems at run time with .NET Core. Go to and use the .NET API analyzer on your project. +You can use compatibility analyzers to let you identify APIs and code patterns in your code that can potentially cause problems at run time with .NET. Go to and use the .NET API analyzer on your project. ## Migrating a Windows Forms application @@ -145,26 +159,26 @@ If you open the *.csproj* project file, you can see something like this: ![Screenshot of the csproj file contents](./media/example-migration-core/csproj-file.png) -As previously mentioned, .NET Core project has a more compact style and you need to migrate the project structure to the new .NET Core SDK style. +As previously mentioned, .NET project has a more compact style and you need to migrate the project structure to the new .NET SDK style. In the Solution Explorer, right click on the Windows Forms project and select **Unload Project** > **Edit**. Now you can update the .csproj file. You'll delete the entire content and replace it with the following code: ```xml - - - WinExe - netcoreapp3.1 - true - false - + + + WinExe + net5.0-windows + true + false + ``` -Save and reload the project. You're now done updating the project file and the project is targeting the .NET Core. +Save and reload the project. You're now done updating the project file and the project is targeting the .NET. -If you compile the project at this point, you'll find some errors related to the WCF client reference. Since this code is autogenerated, you must regenerate it to target .NET Core. +If you compile the project at this point, you'll find some errors related to the WCF client reference. Since this code is autogenerated, you must regenerate it to target .NET. ![Screenshot of compilation errors on Visual Studio](./media/example-migration-core/winforms-compilation-errors.png) @@ -251,7 +265,7 @@ You can also let Visual Studio help you by right-clicking on the **Dependencies* ![Screenshot of the Reference Manager dialog with the eShop.SqlProvider project selected](./media/example-migration-core/reference-manager.png) -Once you add the missing project reference, the application compiles and runs as expected on .NET Core. +Once you add the missing project reference, the application compiles and runs as expected on .NET. >[!div class="step-by-step"] >[Previous](windows-migration.md) diff --git a/docs/architecture/modernize-desktop/index.md b/docs/architecture/modernize-desktop/index.md index 4fb21bdf26237..c91e3d4187460 100644 --- a/docs/architecture/modernize-desktop/index.md +++ b/docs/architecture/modernize-desktop/index.md @@ -1,9 +1,9 @@ --- -title: Modernizing Desktop Apps on Windows 10 with .NET Core 3.1 -description: Learn how to modernize existing desktop apps with .NET Core 3.1 -ms.date: 05/12/2020 +title: Modernizing Desktop Apps on Windows 10 with .NET +description: Learn how to modernize existing desktop apps with .NET +ms.date: 12/29/2020 --- -# Modernizing Desktop Apps on Windows 10 with .NET Core 3.1 +# Modernizing Desktop Apps on Windows 10 with .NET ![Screenshot that shows the modernize desktop apps e-book cover.](./media/modernizing-existing-desktop-apps-ebook-cover.png) @@ -21,7 +21,7 @@ Copyright © 2020 by Microsoft Corporation All rights reserved. No part of the contents of this book may be reproduced or transmitted in any form or by any means without the written permission of the publisher. -This book is provided "as-is" and expresses the author's views and opinions. The views, opinions and information expressed in this book, including URL and other Internet website references, may change without notice. +This book is provided "as-is" and expresses the author's views and opinions. The views, opinions, and information expressed in this book, including URL and other Internet website references, may change without notice. Some examples depicted herein are provided for illustration only and are fictitious. No real association or connection is intended or should be inferred. @@ -69,13 +69,13 @@ Microsoft's approach to modernizing existing applications is to give you the fle ## Who should use the book -We wrote this book for developers and solution architects who want to modernize existing Windows Forms and WPF desktop applications to leverage the benefits of .NET Core and Windows 10. +We wrote this book for developers and solution architects who want to modernize existing Windows Forms and WPF desktop applications to leverage the benefits of .NET and Windows 10. You might also find this book useful if you're a technical decision maker, such as an enterprise architect or a development lead or director who wants an overview of the benefits of updating existing desktop applications. ## How to use the book -This book addresses the "why"—why you might want to modernize your existing applications, and the specific benefits you get from using NET Core 3.1 and MSIX to modernize your desktop apps. The content of the book is designed for architects and technical decision makers who want an overview, but who don't need to focus on implementation and technical, step-by-step details. +This book addresses the "why"—why you might want to modernize your existing applications, and the specific benefits you get from using NET and MSIX to modernize your desktop apps. The content of the book is designed for architects and technical decision makers who want an overview, but who don't need to focus on implementation and technical, step-by-step details. Along the different chapters, sample implementation code snippets and screenshots are provided, with chapter 5 devoted to showcase a complete migration process for sample applications. @@ -83,11 +83,11 @@ Along the different chapters, sample implementation code snippets and screenshot This book covers a specific subset of scenarios that are focused on lift-and-shift scenarios, outlining the way to gain the benefits of modernizing without the effort of rewriting code. -This book isn't about developing modern applications with .NET Core from scratch or about getting started with Windows Forms and WPF. It focuses on how you can update existing desktop applications with the latest technologies for desktop development. +This book isn't about developing modern applications with .NET from scratch or about getting started with Windows Forms and WPF. It focuses on how you can update existing desktop applications with the latest technologies for desktop development. ## Samples used in this book -To highlight the necessary steps to perform a modernization, we'll be using a sample application called `eShopModernizing`. This application has two flavors, Windows Forms and WPF, and we'll show a step-by-step process on how to perform the modernization on both of them to .NET Core. +To highlight the necessary steps to perform a modernization, we'll be using a sample application called `eShopModernizing`. This application has two flavors, Windows Forms and WPF, and we'll show a step-by-step process on how to perform the modernization on both of them to .NET. Also, on the GitHub repository for this book, you'll find the results of the process, which you can consult with if you decide to follow the step-by-step tutorial. diff --git a/docs/architecture/modernize-desktop/migrate-modern-applications.md b/docs/architecture/modernize-desktop/migrate-modern-applications.md index 565513dc8f5ad..0655d305944df 100644 --- a/docs/architecture/modernize-desktop/migrate-modern-applications.md +++ b/docs/architecture/modernize-desktop/migrate-modern-applications.md @@ -1,25 +1,21 @@ --- title: Migrating Modern Desktop applications description: Everything you need to know about the migration process for modern desktop applications. -ms.date: 05/12/2020 +ms.date: 12/29/2020 --- # Migrating Modern Desktop applications -In this chapter, we're exploring the most common issues and challenges you can face when migrating an existing application from .NET Framework to .NET Core. +In this chapter, we're exploring the most common issues and challenges you can face when migrating an existing application from .NET Framework to .NET. A complex desktop application doesn't work in isolation and needs some kind of interaction with subsystems that may reside on the local machine or on a remote server. It will probably need some kind of database to connect as a persistence -storage either locally or remotely. With the raise of Internet and service-oriented architectures, it's common to have your application connected to some sort of service residing on a remote server or in the cloud. You may need to access the machine file system to implement some functionality. Alternatively, maybe you're using a piece of functionality that resides inside -a COM object outside your application, which is a common scenario if, for example, you're integrating Office assemblies in your app. +storage either locally or remotely. With the raise of Internet and service-oriented architectures, it's common to have your application connected to some sort of service residing on a remote server or in the cloud. You may need to access the machine file system to implement some functionality. Alternatively, maybe you're using a piece of functionality that resides inside a COM object outside your application, which is a common scenario if, for example, you're integrating Office assemblies in your app. -Besides, there are differences in the API surface that is exposed by .NET Framework and .NET Core, and some features that are available on .NET Framework aren't available on .NET Core. So, it's important for you to know and take them -into account when planning a migration. +Besides, there are differences in the API surface that is exposed by .NET Framework and .NET, and some features that are available on .NET Framework aren't available on .NET. So, it's important for you to know and take them into account when planning a migration. ## Configuration files -Configuration files offer the possibility to store sets of properties that are read at run time and affect the behavior of our apps, such as where to locate a database or how many times to execute a loop. The beauty of this technique is -that you can modify some aspects of the application without the need to recode and recompile. This comes in handy when, for example, the same app code runs on a development environment with a certain set of configuration values and in -production with a different one. +Configuration files offer the possibility to store sets of properties that are read at run time and affect the behavior of our apps, such as where to locate a database or how many times to execute a loop. The beauty of this technique is that you can modify some aspects of the application without the need to recode and recompile. This comes in handy when, for example, the same app code runs on a development environment with a certain set of configuration values and in production with a different one. ### Configuration on .NET Framework @@ -28,9 +24,9 @@ If you have a working .NET Framework desktop application, chances are you have a Within the .NET Framework infrastructure, there's a hierarchy of configuration files that inherit properties from its parents. You can find a *machine.config* file that defines many properties and configuration sections that can be used or overridden in any descendant configuration file. -### Configuration on .NET Core +### Configuration on .NET -In the .NET Core world, there's no *machine.config* file. And even though you can continue to use the old fashioned namespace, you may consider switching to the modern , which offers a good number of enhancements. +In the .NET world, there's no *machine.config* file. And even though you can continue to use the old fashioned namespace, you may consider switching to the modern , which offers a good number of enhancements. The configuration API supports the concept of configuration provider, which defines the data source to be used to load the configuration. There are different kinds of built-in providers, such as: @@ -50,13 +46,13 @@ The object lets y ### Migrating Configuration files -You can continue to use your existing app.config XML file. However, you could take this opportunity to migrate your configuration to benefit from the several enhancements made on .NET Core. +You can continue to use your existing app.config XML file. However, you could take this opportunity to migrate your configuration to benefit from the several enhancements made on .NET. To migrate from an old-style *app.config* to a new configuration file, you should choose between an XML format and a JSON format. If you choose XML, the conversion is straightforward. Since the content is the same, just rename the *app.config* file to a file with XML extension. Then, change the code that references AppSettings to use the `ConfigurationBuilder` class. This change should be easy. -If you want to use a JSON format and you don't want to migrate by hand, there's a tool called [dotnet-config2json](https://www.nuget.org/packages/dotnet-config2json/) available on .NET Core that can convert an *app.config* file to a JSON configuration file. +If you want to use a JSON format and you don't want to migrate by hand, there's a tool called [dotnet-config2json](https://www.nuget.org/packages/dotnet-config2json/) available on .NET that can convert an *app.config* file to a JSON configuration file. You may also come across some issues when using configuration sections that were defined in the *machine.config* file. For example, consider the following configuration: @@ -79,7 +75,7 @@ You may also come across some issues when using configuration sections that were ``` -If you take this configuration to a .NET Core, you'll get an exception: +If you take this configuration to a .NET, you'll get an exception: Unrecognized configuration section system.diagnostics @@ -105,15 +101,15 @@ The most common examples of database you can find when talking about Windows Des ### ODBC -You can continue to use ODBC on .NET Core since Microsoft is providing the `System.Data.Odbc` library compatible with .NET Standard 2.0. +You can continue to use ODBC on .NET since Microsoft is providing the `System.Data.Odbc` library compatible with .NET Standard 2.0. ### OLE DB -[OLE DB](/previous-versions/windows/desktop/ms722784(v=vs.85)) has been a great way to access various data sources in a uniform manner. But it was based on COM, which is a Windows-only technology, and as such wasn't the best fit for a cross-platform technology such as .NET Core. It's also unsupported in SQL Server versions 2014 and later. For those reasons, OLE DB won't be supported by .NET Core. +[OLE DB](/previous-versions/windows/desktop/ms722784(v=vs.85)) has been a great way to access various data sources in a uniform manner. But it was based on COM, which is a Windows-only technology, and as such wasn't the best fit for a cross-platform technology such as .NET. It's also unsupported in SQL Server versions 2014 and later. For those reasons, OLE DB won't be supported by .NET. ### ADO.NET -You can still use ADO.NET from your existing desktop code on .NET Core. You just need to update some NuGet packages. +You can still use ADO.NET from your existing desktop code on .NET. You just need to update some NuGet packages. ### EF Core vs. EF6 @@ -121,9 +117,9 @@ There are two currently supported versions of Entity Framework (EF), Entity Fram The latest technology released as part of the .NET Framework world is Entity Framework, with 6.4 being the latest version. With the launch of .NET Core, Microsoft also released a new data access stack based on Entity Framework and called Entity Framework Core. -You can use EF 6.4 and EF Core from both .NET Framework and .NET Core. So, what are the decision drivers to help to decide between the two? +You can use EF 6.4 and EF Core from both .NET Framework and .NET. So, what are the decision drivers to help to decide between the two? -EF 6.3 is the first version of EF6 that can run on .NET Core and work cross-platform. In fact, the main goal of this release was to make it easier to migrate existing applications that use EF6 to .NET Core. +EF 6.3 is the first version of EF6 that can run on .NET and work cross-platform. In fact, the main goal of this release was to make it easier to migrate existing applications that use EF6 to .NET. EF Core was designed to provide a developer experience similar to EF6. Most of the top-level APIs remain the same, so EF Core will feel familiar to developers who have used EF6. @@ -132,7 +128,7 @@ For more information, see [Compare EF Core & EF6](/ef/efcore-and-ef6/). The recommendation is to use EF Core if: -* The app needs the capabilities of .NET Core. +* The app needs the capabilities of .NET. * EF Core supports all of the features that the app requires. Consider using EF6 if both of the following conditions are true: @@ -146,7 +142,7 @@ Consider using EF6 if both of the following conditions are true: SQL Server has been one of the databases of choice if you were developing for the desktop some years ago. With the use of in .NET Framework, you could access versions of SQL Server, which encapsulates database-specific protocols. -In .NET Core, you can find a new `SqlClient` class, fully compatible with the one existing in the .NET Framework but located in the library. You just have to add a reference to the [Microsoft.Data.SqlClient](https://www.nuget.org/packages/Microsoft.Data.SqlClient/) NuGet package and do some renaming for the namespaces and everything should work as expected. +In .NET, you can find a new `SqlClient` class, fully compatible with the one existing in the .NET Framework but located in the library. You just have to add a reference to the [Microsoft.Data.SqlClient](https://www.nuget.org/packages/Microsoft.Data.SqlClient/) NuGet package and do some renaming for the namespaces and everything should work as expected. #### Microsoft Access @@ -157,19 +153,19 @@ to Microsoft Access using the library. With the raise of service-oriented architectures, desktop applications began to evolve from a client-server model to the three-layer approach. In the client-server approach, a direct database connection is established from the client holding the business logic usually inside a single EXE file. On the other hand, the three-layer approach establishes an intermediate service layer implementing business logic and database access allowing for better security, scalability, and reusability. Instead of working directly with datasets of data, the layer approach relies in a set of services implementing contracts and types objects as a way to implement data transfer. -If you have a desktop application using a WCF service and you want to migrate it to .NET Core, there are some things to consider. +If you have a desktop application using a WCF service and you want to migrate it to .NET, there are some things to consider. -The first thing is how to resolve the configuration to access the service. Because the configuration is different on .NET Core, you'll need to make some updates in your configuration file. +The first thing is how to resolve the configuration to access the service. Because the configuration is different on .NET, you'll need to make some updates in your configuration file. Second, you'll need to regenerate the service client with the new tools present on Visual Studio 2019. In this step, you must consider activating the generation of the synchronous operations to make the client compatible with your existing code. -After the migration, if you find that there are libraries you need that aren't present on .NET Core, you can add a reference to the [Microsoft.Windows.Compatibility](https://www.nuget.org/packages/Microsoft.Windows.Compatibility) NuGet package and see if the missing functions are there. +After the migration, if you find that there are libraries you need that aren't present on .NET, you can add a reference to the [Microsoft.Windows.Compatibility](https://www.nuget.org/packages/Microsoft.Windows.Compatibility) NuGet package and see if the missing functions are there. -If you're using the class to perform web service calls, you may find some differences on .NET Core. The recommendation is to use the System.Net.Http.HttpClient instead. +If you're using the class to perform web service calls, you may find some differences on .NET. The recommendation is to use the System.Net.Http.HttpClient instead. ## Consuming a COM Object -Currently, there's no way to add a reference to a COM object from Visual Studio 2019 to use with .NET Core. So, you have to manually modify the project file. +Currently, there's no way to add a reference to a COM object from Visual Studio 2019 to use with .NET. So, you have to manually modify the project file. Insert a `COMReference` structure inside the project file like in the following example: @@ -188,7 +184,7 @@ Insert a `COMReference` structure inside the project file like in the following ## More things to consider -Several technologies available to .NET Framework libraries aren't available for .NET Core. If your code relies on some of these technologies, consider the alternative approaches outlined in this section. +Several technologies available to .NET Framework libraries aren't available for .NET Core or later. If your code relies on some of these technologies, consider the alternative approaches outlined in this section. The [Windows Compatibility Pack](../../core/porting/windows-compat-pack.md) provides access to APIs that were previously available only for .NET Framework. It can be used on .NET Core and .NET Standard projects. @@ -199,11 +195,11 @@ For more information on API compatibility, you can find documentation about brea Application domains (AppDomains) isolate apps from one another. AppDomains require runtime support and are expensive. Creating additional app domains isn't supported. For code isolation, we recommend separate processes or using containers as an alternative. For the dynamic loading of assemblies, we recommend the new  class. -To make code migration from .NET Framework easier, .NET Core exposes some of the AppDomain API surface. Some of the APIs function normally (for example, ), some members do nothing (for example, ), and some of them throw (for example, ). +To make code migration from .NET Framework easier, .NET exposes some of the AppDomain API surface. Some of the APIs function normally (for example, ), some members do nothing (for example, ), and some of them throw (for example, ). ### Remoting -.NET Remoting was used for cross-AppDomain communication, which is no longer supported. Also, Remoting requires runtime support, which is expensive to maintain. For these reasons, .NET Remoting isn't supported on .NET Core. +.NET Remoting was used for cross-AppDomain communication, which is no longer supported. Also, Remoting requires runtime support, which is expensive to maintain. For these reasons, .NET Remoting isn't supported on .NET. For communication across processes, you should consider inter-process communication (IPC) mechanisms as an alternative to Remoting, such as the or the class. @@ -211,7 +207,7 @@ Across machines, use a network-based solution as an alternative. Preferably, use ### Code Access Security (CAS) -Sandboxing, which relies on the runtime or the framework to constrain which resources a managed application or library uses or runs, isn't supported on .NET Core. +Sandboxing, which relies on the runtime or the framework to constrain which resources a managed application or library uses or runs, isn't supported on .NET. Use security boundaries that are provided by the operating system, such as virtualization, containers, or user accounts for running processes with the minimum set of privileges. diff --git a/docs/architecture/modernize-desktop/toc.yml b/docs/architecture/modernize-desktop/toc.yml index 196687dede070..0f84ec7e6650d 100644 --- a/docs/architecture/modernize-desktop/toc.yml +++ b/docs/architecture/modernize-desktop/toc.yml @@ -1,15 +1,15 @@ -- name: Modernizing desktop apps on Windows 10 with .NET Core 3.1 +- name: Modernizing desktop apps on Windows 10 with .NET href: index.md items: - name: Why modern desktop applications href: why-modern-applications.md - - name: "What's new with .NET Core for Desktop?" - href: whats-new-dotnet-core.md + - name: "What's new with .NET for Desktop?" + href: whats-new-dotnet.md - name: Migrating Modern Desktop Applications href: migrate-modern-applications.md - name: Windows 10 Migration href: windows-migration.md - - name: Example of migrating to .NET Core 3.1 - href: example-migration-core.md + - name: Example of migrating to .NET + href: example-migration.md - name: Deploying Modern Desktop Applications href: deploy-modern-applications.md diff --git a/docs/architecture/modernize-desktop/whats-new-dotnet-core.md b/docs/architecture/modernize-desktop/whats-new-dotnet.md similarity index 79% rename from docs/architecture/modernize-desktop/whats-new-dotnet-core.md rename to docs/architecture/modernize-desktop/whats-new-dotnet.md index ca58b224b50bf..d7dabc81d535f 100644 --- a/docs/architecture/modernize-desktop/whats-new-dotnet-core.md +++ b/docs/architecture/modernize-desktop/whats-new-dotnet.md @@ -1,12 +1,12 @@ --- -title: What's new with .NET Core for Desktop? -description: Learn about .NET Core, differences between .NET Core and .NET Framework, and the new features that were added. -ms.date: 05/12/2020 +title: What's new with .NET for Desktop? +description: Learn about .NET, differences between .NET and .NET Framework, and the new features that were added. +ms.date: 12/29/2020 --- -# What's new with .NET Core for Desktop? +# What's new with .NET for Desktop? -Starting with .NET Core 3.0, .NET Core supports Windows Forms and WPF. So, now you have a choice between .NET Framework and .NET Core for your desktop applications. This chapter will describe what is .NET Core and what are its benefits for desktop applications. +Starting with .NET Core 3.0, .NET supports Windows Forms and WPF. So, now you have a choice between .NET Framework and .NET for your desktop applications. This chapter will describe what is .NET and what are its benefits for desktop applications. ## The motivation behind .NET Core @@ -50,11 +50,21 @@ The benefits of .NET Core come from these three characteristics: Starting with .NET Core 3.0, besides the existing support for web and cloud, there's also support for desktop, IoT, and AI domains. The goal for this framework is impressive: to target every type of .NET development present and future. Microsoft plans to complete this vision with .NET 5 at the end of 2020. The "Core" name was removed to reinforce its uniqueness in the .NET world. +## .NET 5 = .NET Core vNext + +.NET 5 is the next step forward with .NET Core. The .NET 5.0 aims to improve .NET in a few key ways: + +- Produce a single .NET runtime and framework that can be used everywhere and that has uniform runtime behaviors and developer experiences. +- Expand the capabilities of .NET by taking the best of .NET Core, .NET Framework, Xamarin and Mono. +- Build that product out of a single code-base that developers (Microsoft and the community) can work on and expand together and that improves all scenarios. + +This new release and direction are a game-changer for .NET. With .NET 5, your code and project files will look and feel the same no matter which type of app you’re building. You’ll have access to the same runtime, API and language capabilities with each app. This includes new [performance improvements](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-2-1/) that get committed to corefx, practically daily. For more details refer [What's new in .NET 5](https://docs.microsoft.com/dotnet/core/dotnet-five) + ![All domains of .NET 5](./media/whats-new-dotnet-core/all-domains-of-dotnet5.png) -## .NET Framework vs. .NET Core +## .NET Framework vs. .NET -So now that you understand the relevance of .NET Core inside the Microsoft strategy for .NET, you might be wondering what happens with .NET Framework. You could be asking questions like: do you have to abandon it? Is it going to disappear? What are my choices to modernize the applications I have on .NET Framework? +So now that you understand the relevance of .NET, you might be wondering what happens with .NET Framework. You could be asking questions like: do you have to abandon it? Is it going to disappear? What are my choices to modernize the applications I have on .NET Framework? In 2019 the last version of the **.NET Framework - 4.8** was released. It included three major improvements for desktop applications: @@ -64,15 +74,15 @@ In 2019 the last version of the **.NET Framework - 4.8** was released. It includ Since .NET Framework is installed on millions of machines, Microsoft will continue to support it but won't add new features. -.NET Core is the open-source, cross-platform, and fast-moving version of .NET. Because of its side-by-side nature, it can take changes without the fear of breaking any application. This means that .NET Core will get new APIs and language features over time that .NET Framework won't. Also, **.NET Core** already has features that were impossible for .NET Framework, such as: +.NET 5 is the open-source, cross-platform, and fast-moving version of .NET family. Because of its side-by-side nature, it can take changes without the fear of breaking any application. This means that .NET will get new APIs and language features over time that .NET Framework won't. Also, **.NET** already has features that were impossible for .NET Framework, such as: -- **Side-by-side versions of .NET supporting Windows Forms and WPF**: This solves the problem of side effects when updating the machine's framework version. Multiple versions of .NET Core can be installed on the same machine and each application specifies which version of .NET Core it should use. Even more, now you can develop and run Windows Forms and WPF on top of .NET Core. -- **Embed .NET directly into an application**: You can deploy .NET Core as part of your application package. This enables you to take advantage of the latest version, features, and APIs without having to wait for a specific version to be installed on the machine. -- **Take advantage of .NET Core features**: .NET Core is the fast-moving, open-source version of .NET. Its side-by-side nature enables fast introduction of new innovative APIs and Base Class Libraries (BCL) improvements without the risk of breaking compatibility. Now Windows Forms and WPF applications can take advantage of the latest .NET Core features, which also includes more fundamental fixes for runtime performance, high-DPI support, and so on. +- **Side-by-side versions of .NET supporting Windows Forms and WPF**: This solves the problem of side effects when updating the machine's framework version. Multiple versions of .NET can be installed on the same machine and each application specifies which version of .NET it should use. Even more, now you can develop and run Windows Forms and WPF on top of .NET. +- **Embed .NET directly into an application**: You can deploy .NET as part of your application package. This enables you to take advantage of the latest version, features, and APIs without having to wait for a specific version to be installed on the machine. +- **Take advantage of .NET features**: .NET Core is the fast-moving, open-source version of .NET. Its side-by-side nature enables fast introduction of new innovative APIs and Base Class Libraries (BCL) improvements without the risk of breaking compatibility. Now Windows Forms and WPF applications can take advantage of the latest .NET features, which also includes more fundamental fixes for runtime performance, high-DPI support, and so on. -An essential part of the roadmap for Microsoft was to ease developers to move applications to .NET Core and in future to .NET 5. But if you have existing .NET Framework applications, you shouldn't feel pressured to move to .NET Core. .NET Framework will be fully supported and will always be a part of Windows. However, if you want to use the newest language features and APIs in the future, you'll need to move your applications to .NET Core. +An essential part of the roadmap for Microsoft was to ease developers to move applications to .NET Core and in later to .NET 5. But if you have existing .NET Framework applications, you shouldn't feel pressured to move to .NET 5. .NET Framework will be fully supported and will always be a part of Windows. However, if you want to use the newest language features and APIs in the future, you'll need to move your applications to .NET. -For your brand-new desktop applications, we recommend starting directly on .NET Core. It's lightweight and cross platform, runs side by side, has high performance, and fits perfectly on containers and microservices architectures. +For your brand-new desktop applications, we recommend starting directly on .NET 5. It's lightweight and cross platform, runs side by side, has high performance, and fits perfectly on containers and microservices architectures. ![You can update your .NET Framework applications using the latest .NET Framework version or port your applications to .NET Core](./media/whats-new-dotnet-core/framework-vs-core.png) diff --git a/docs/architecture/modernize-desktop/why-modern-applications.md b/docs/architecture/modernize-desktop/why-modern-applications.md index 31fc40fe565da..0c6e0c944a8c3 100644 --- a/docs/architecture/modernize-desktop/why-modern-applications.md +++ b/docs/architecture/modernize-desktop/why-modern-applications.md @@ -1,7 +1,7 @@ --- title: Why modern desktop applications description: Learn about desktop technologies such as Windows Forms, WPF, and UWP in the modern world. -ms.date: 09/16/2019 +ms.date: 12/29/2020 --- # Why modern desktop applications @@ -9,7 +9,7 @@ ms.date: 09/16/2019 ### A story of one company -Back in early 2000s, one multinational company started developing a distributed desktop solution to exchange information between different branches of the company and execute optimized operations on centralized units. They have chosen a brand-new framework called Windows Forms (also known as WinForms) for their application development. Over the years, the project evolved into a mature, well tested, and time-proven application with hundreds of thousands of lines of code. Time passed and .NET Framework 2.0 is no longer the hot new technology. The developers who are working on this application are facing a dilemma. They'd like to use the latest stack of technologies in their development and have their application look and "feel" modern. At the same time, they don't want to throw away the great product they have built over 15 years and rewrite the entire application from scratch. +Back in the early 2000s, one multinational company started developing a distributed desktop solution to exchange information between different branches of the company and execute optimized operations on centralized units. They have chosen a brand-new framework called Windows Forms (also known as WinForms) for their application development. Over the years, the project evolved into a mature, well tested, and time-proven application with hundreds of thousands of lines of code. Time passed and .NET Framework 2.0 is no longer the hot new technology. The developers who are working on this application are facing a dilemma. They'd like to use the latest stack of technologies in their development and have their application look and "feel" modern. At the same time, they don't want to throw away the great product they have built over 15 years and rewrite the entire application from scratch. ### Your story @@ -19,19 +19,19 @@ You might find yourself in the same boat, where you have mature Windows Forms or Before the raise of the Internet, desktop applications were the main approach to build software systems. Developers could choose any programming language, such as COBOL, Fortran, VB6, or C++. But where they developed small tools or complex distributed architectures, they were all desktop applications. -Then, Internet technologies started shocking the development world and winning over more and more engineers with advantages like easy deployment and simplified distribution processes. The fact that once a web application was deployed to production all users got automatic updates made a huge impact on the software agility. +Then, Internet technologies started shocking the development world and winning over more engineers with advantages like easy deployment and simplified distribution processes. The fact that once a web application was deployed to production all users got automatic updates made a huge impact on the software agility. -However, the Internet infrastructure, underlying protocols, and standards like HTTP and HTML weren't designed for building complex applications. In fact, the major development effort back then was aiming just one goal: to give web applications same capabilities that desktop applications have, such as fast data input and state management. +However, the Internet infrastructure, underlying protocols, and standards like HTTP and HTML weren't designed for building complex applications. In fact, the major development effort back then was aiming just one goal: to give web applications the same capabilities that desktop applications have, such as fast data input and state management. Even though web and mobile applications have grown at an incredible pace, for certain tasks desktop applications still hold the number one place in terms of efficiency and performance. That explains why there are millions of developers who are building their projects with WPF and WinForms and the amount of those applications is constantly growing. Here are some reasons for choosing desktop applications in your development: -- Desktop apps have better interaction with user's PC. -- The performance of desktop applications for complex calculations is much higher than performance of web applications. -- Running custom logic on the client side is possible but much harder with a web application. +- Desktop apps have better interaction with the user's PC. +- The performance of desktop applications for complex calculations is much higher than the performance of web applications. +- Running custom logic on the client-side is possible but much harder with a web application. - Using multithreading is easier and more efficient in a desktop application. -- The learning curve for designing user interfaces (UIs) isn't steep. And for WinForms, it's completely intuitive with drag-and-drop experience of the Windows Forms designer. +- The learning curve for designing user interfaces (UIs) isn't steep. And for WinForms, it's intuitive with the drag-and-drop experience of the Windows Forms designer. - It's easy to start coding and testing your algorithms without the need to set up a server infrastructure or to care about connectivity problems, firewalls, and browser compatibility. - Debugging is powerful as compared to web debugging. - Access to hardware devices, such as camera, Bluetooth, or card readers, is easy. @@ -96,7 +96,7 @@ UWP contains a presentation framework that is XAML-based, like WPF, but it has s ## A tale of two platforms -In the last 20 years, while UI desktop technologies were growing and following the path from Windows Forms to UWP, the hardware was also evolving from heavy weight PC units with small CRT monitors to high-DPI monitors and lightweight tablets and phones with different data input techniques like Touch and Ink. These changes resulted in creating two different concepts: a Desktop Application and a Modern Application. A Modern Application is one that considers different device form factors, various input and output methods, and leverages modern desktop features while running on a sandboxed execution model. The (traditional) Desktop Application, on the other hand, is an application that needs a solid UI with high density of controls that is best operated with a mouse and a keyboard. +In the last 20 years, while UI desktop technologies were growing and following the path from Windows Forms to UWP, the hardware was also evolving from heavy weight PC units with small CRT monitors to high-DPI monitors and lightweight tablets and phones with different data input techniques like Touch and Ink. These changes resulted in creating two different concepts: a Desktop Application and a Modern Application. A Modern Application is one that considers different device form factors, various input and output methods, and leverages modern desktop features while running on a sandboxed execution model. The (traditional) Desktop Application, on the other hand, is an application that needs a solid UI with a high density of controls that is best operated with a mouse and a keyboard. The following table describes the differences between the two concepts: @@ -137,13 +137,13 @@ This path will show you how you can leverage modern desktop features into your e Modern development cycles have stressed out to provide agility on how new versions of applications are deployed to every single user. Since Windows Forms and WPF applications are based on a particular version of the .NET Framework that must be present on the machine, they can't take advantage of new .NET Framework version features without the intervention of the IT people with the risk of having side effects for other apps running on the same machine. It has limited the innovation pace for developers forcing them to stay on outdated versions of the .NET Framework. -Since the launch of .NET Core 3.0, you can leverage a new approach of deploying multiple versions of .NET Core side by side and specifying which version of .NET Core each application should target. This way, you can use newest features in one application while being confident you aren't going to break any other applications. +Since the launch of .NET Core 3.0, you can leverage a new approach of deploying multiple versions of .NET side by side and specifying which version of .NET each application should target. This way, you can use the newest features in one application while being confident you aren't going to break any other applications. ### Installation -Desktop applications always rely on some sort of installation process before the user can start using them. This fact brought into the game a set of technologies, from MSI and ClickOnce to custom installers or even XCOPY deployment. Any of these methods deals with delicate problems because applications need a way to access shared resources on the machine. Sometimes installation needs to access the Registry to insert or update new Key Values, sometimes to update shared DLLs referenced by the main application. This causes a continuous headache for users, creating this perception that once you install some application, your computer will never be the same, even if you uninstall it afterwards. +Desktop applications always rely on some sort of installation process before the user can start using them. This fact brought into the game a set of technologies, from MSI and ClickOnce to custom installers or even XCOPY deployment. Any of these methods deals with delicate problems because applications need a way to access shared resources on the machine. Sometimes installation needs to access the Registry to insert or update new Key Values, sometimes to update shared DLLs referenced by the main application. This behavior causes a continuous headache for users, creating this perception that once you install some application, your computer will never be the same, even if you uninstall it afterwards. -In this book, we'll introduce a new way of installing applications with MSIX that solves the problem described earlier. You'll learn how you can easily set up a packaging, installation, and updates for your application. +In this book, we'll introduce a new way of installing applications with MSIX that solves the problem described earlier. You'll learn how you can easily set up packaging, installation, and updates for your application. >[!div class="step-by-step"] >[Previous](index.md) diff --git a/docs/architecture/modernize-desktop/windows-migration.md b/docs/architecture/modernize-desktop/windows-migration.md index 2bd8813dcc83e..1f1f794fbc19e 100644 --- a/docs/architecture/modernize-desktop/windows-migration.md +++ b/docs/architecture/modernize-desktop/windows-migration.md @@ -1,7 +1,7 @@ --- title: Windows 10 migration description: Deep dive in Windows 10 features such as packaging and XAML Islands. -ms.date: 09/16/2019 +ms.date: 12/29/2020 --- # Windows 10 migration @@ -14,9 +14,9 @@ With the release of Windows 10, Microsoft introduced many innovations to support - Use a pen to draw or handwrite text that is automatically recognized and digitalized. - Run locally customized AI models built on the cloud using WinML. -All these features are enabled for Windows developers through Windows Runtime (WinRT) libraries. You can take advantage of these features in your existing desktop apps because the libraries are exposed to both the .NET Framework and .NET Core as well. You can even modernize your UI with the use of XAML Islands and improve the visuals and behavior of your apps according to the times. +All these features are enabled for Windows developers through Windows Runtime (WinRT) libraries. You can take advantage of these features in your existing desktop apps because the libraries are exposed to both the .NET Framework and .NET as well. You can even modernize your UI with the use of XAML Islands and improve the visuals and behavior of your apps according to the times. -One important thing to note here is that you don't need to abandon .NET Framework technology to follow this modernization path. You can safely stay on there and have all the benefits of Windows 10 without the pressure to migrate to .NET Core. So, you get both the power and the flexibility to choose your modernization path. +One important thing to note here is that you don't need to abandon .NET Framework technology to follow this modernization path. You can safely stay on there and have all the benefits of Windows 10 without the pressure to migrate to .NET. So, you get both the power and the flexibility to choose your modernization path. ## WinRT APIs @@ -272,7 +272,7 @@ To see a walkthrough about how to use XAML Islands, see: A XAML custom control is a control (or user control) created by you or by third parties (including WinUI 2.x controls). To host a custom UWP control in a Windows Forms or WPF app, you'll need: -- To use the `WindowsXamlHost` UWP control in your .NET Core 3.x app. +- To use the `WindowsXamlHost` UWP control in your .NET app. - To create a UWP app project that defines a `XamlApplication` object. Your WPF or Windows Forms project must have access to an instance of the `Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication` class provided by the Windows Community Toolkit. This object acts as a root metadata provider for loading metadata for custom UWP XAML types in assemblies in the current directory of your application. The recommended way to do this is to add a Blank @@ -326,7 +326,7 @@ WinUI 3 will address this critical feedback adding **WinUI in desktop apps**. Th Within this aggregation, WinUI 3 will let developers easily mix and match the right combination of: * App model: UWP, Win32 -* Platform: .NET Core or Native +* Platform: .NET or Native * Language: .NET (C\#, Visual Basic), standard C++ * Packaging: MSIX, AppX for the Microsoft Store, unpackaged * Interop: use WinUI 3 to extend existing WPF, WinForms, and MFC apps using WinUI XAML Islands. From 6759ff7318e13b234cb65a00a0f4de90a944e301 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Tue, 29 Dec 2020 19:59:02 +0530 Subject: [PATCH 02/28] Fixed lint error. --- docs/architecture/modernize-desktop/whats-new-dotnet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/whats-new-dotnet.md b/docs/architecture/modernize-desktop/whats-new-dotnet.md index d7dabc81d535f..34304d0ce1019 100644 --- a/docs/architecture/modernize-desktop/whats-new-dotnet.md +++ b/docs/architecture/modernize-desktop/whats-new-dotnet.md @@ -58,7 +58,7 @@ Starting with .NET Core 3.0, besides the existing support for web and cloud, the - Expand the capabilities of .NET by taking the best of .NET Core, .NET Framework, Xamarin and Mono. - Build that product out of a single code-base that developers (Microsoft and the community) can work on and expand together and that improves all scenarios. -This new release and direction are a game-changer for .NET. With .NET 5, your code and project files will look and feel the same no matter which type of app you’re building. You’ll have access to the same runtime, API and language capabilities with each app. This includes new [performance improvements](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-2-1/) that get committed to corefx, practically daily. For more details refer [What's new in .NET 5](https://docs.microsoft.com/dotnet/core/dotnet-five) +This new release and direction are a game-changer for .NET. With .NET 5, your code and project files will look and feel the same no matter which type of app you’re building. You’ll have access to the same runtime, API and language capabilities with each app. This includes new [performance improvements](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-2-1/) that get committed to corefx, practically daily. For more details refer [What's new in .NET 5](https://docs.microsoft.com/dotnet/core/dotnet-five). ![All domains of .NET 5](./media/whats-new-dotnet-core/all-domains-of-dotnet5.png) From 5cbb989b79c40e0c9279337ace259329f8d92fa0 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Tue, 29 Dec 2020 20:02:01 +0530 Subject: [PATCH 03/28] Updated heading for modernize desktop ebook --- docs/architecture/toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/toc.yml b/docs/architecture/toc.yml index 50577b22ab94a..7ae2e7c9cf721 100644 --- a/docs/architecture/toc.yml +++ b/docs/architecture/toc.yml @@ -15,7 +15,7 @@ href: containerized-lifecycle/ - name: Modernize existing .NET applications with Azure cloud and Windows Containers href: modernize-with-azure-containers/ - - name: "Modernizing desktop apps on Windows 10 with .NET Core 3.1" + - name: "Modernizing desktop apps on Windows 10 with .NET" href: modernize-desktop/ - name: ".NET Microservices: Architecture for containerized .NET applications" href: microservices/ From 478502fcd2e5d6447ee42ef2e14ec9e349d761e6 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Tue, 5 Jan 2021 11:10:41 +0530 Subject: [PATCH 04/28] Updated title and fixed broken links --- .../modernize-desktop/deploy-modern-applications.md | 2 +- docs/architecture/modernize-desktop/index.md | 6 +++--- .../modernize-desktop/migrate-modern-applications.md | 2 +- docs/architecture/modernize-desktop/toc.yml | 2 +- .../modernize-desktop/why-modern-applications.md | 2 +- docs/architecture/modernize-desktop/windows-migration.md | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/architecture/modernize-desktop/deploy-modern-applications.md b/docs/architecture/modernize-desktop/deploy-modern-applications.md index 66a1cbcdd0e4a..16bb61b16ebd1 100644 --- a/docs/architecture/modernize-desktop/deploy-modern-applications.md +++ b/docs/architecture/modernize-desktop/deploy-modern-applications.md @@ -221,4 +221,4 @@ MSIX creates a user interface for installation automatically showing some proper Once you've generated the new MSIX package and moved it to the deployment server, you just have to edit the *.appinstaller* file to reflect these changes, mainly the version and the path to the new MSIX file. The next time the user launches the application, the system is going to detect the change and download the files for the new version in the background. When this is done, installation will execute on new application launch transparently for your user. >[!div class="step-by-step"] ->[Previous](example-migration-core.md) +>[Previous](example-migration.md) diff --git a/docs/architecture/modernize-desktop/index.md b/docs/architecture/modernize-desktop/index.md index c91e3d4187460..30ec66ae6f2de 100644 --- a/docs/architecture/modernize-desktop/index.md +++ b/docs/architecture/modernize-desktop/index.md @@ -1,9 +1,9 @@ --- -title: Modernizing Desktop Apps on Windows 10 with .NET -description: Learn how to modernize existing desktop apps with .NET +title: Modernizing Desktop Apps on Windows 10 with .NET 5 +description: Learn how to modernize existing desktop apps with .NET 5 ms.date: 12/29/2020 --- -# Modernizing Desktop Apps on Windows 10 with .NET +# Modernizing Desktop Apps on Windows 10 with .NET 5 ![Screenshot that shows the modernize desktop apps e-book cover.](./media/modernizing-existing-desktop-apps-ebook-cover.png) diff --git a/docs/architecture/modernize-desktop/migrate-modern-applications.md b/docs/architecture/modernize-desktop/migrate-modern-applications.md index 0655d305944df..c18f96e175a13 100644 --- a/docs/architecture/modernize-desktop/migrate-modern-applications.md +++ b/docs/architecture/modernize-desktop/migrate-modern-applications.md @@ -218,5 +218,5 @@ Similar to CAS, Security Transparency separates sandboxed code from security cri Use security boundaries that are provided by the operating system, such as virtualization, containers, or user accounts for running processes with the least set of privileges. >[!div class="step-by-step"] ->[Previous](whats-new-dotnet-core.md ) +>[Previous](whats-new-dotnet.md ) >[Next](windows-migration.md) diff --git a/docs/architecture/modernize-desktop/toc.yml b/docs/architecture/modernize-desktop/toc.yml index 0f84ec7e6650d..d1a886da0197a 100644 --- a/docs/architecture/modernize-desktop/toc.yml +++ b/docs/architecture/modernize-desktop/toc.yml @@ -1,4 +1,4 @@ -- name: Modernizing desktop apps on Windows 10 with .NET +- name: Modernizing desktop apps on Windows 10 with .NET 5 href: index.md items: - name: Why modern desktop applications diff --git a/docs/architecture/modernize-desktop/why-modern-applications.md b/docs/architecture/modernize-desktop/why-modern-applications.md index 0c6e0c944a8c3..7931d6de58200 100644 --- a/docs/architecture/modernize-desktop/why-modern-applications.md +++ b/docs/architecture/modernize-desktop/why-modern-applications.md @@ -147,4 +147,4 @@ In this book, we'll introduce a new way of installing applications with MSIX tha >[!div class="step-by-step"] >[Previous](index.md) ->[Next](whats-new-dotnet-core.md) +>[Next](whats-new-dotnet.md) diff --git a/docs/architecture/modernize-desktop/windows-migration.md b/docs/architecture/modernize-desktop/windows-migration.md index 1f1f794fbc19e..427bd32c23bf0 100644 --- a/docs/architecture/modernize-desktop/windows-migration.md +++ b/docs/architecture/modernize-desktop/windows-migration.md @@ -335,4 +335,4 @@ If you want to know more details, Microsoft is sharing this roadmap in [!div class="step-by-step"] >[Previous](migrate-modern-applications.md) ->[Next](example-migration-core.md) +>[Next](example-migration.md) From 6ace353322db2ad47ef8b7256f3328e2b1714a16 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Tue, 5 Jan 2021 11:14:13 +0530 Subject: [PATCH 05/28] Updated title --- docs/architecture/modernize-desktop/example-migration.md | 4 ++-- docs/architecture/modernize-desktop/toc.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 2d5d9c4a668f3..66f051f319e96 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -1,6 +1,6 @@ --- -title: Example of migrating to .NET -description: Showing how to migrate a sample applications targeting .NET Framework to .NET. +title: Example of migrating to .NET 5 +description: Showing how to migrate a sample applications targeting .NET Framework to .NET 5. ms.date: 12/29/2020 --- diff --git a/docs/architecture/modernize-desktop/toc.yml b/docs/architecture/modernize-desktop/toc.yml index d1a886da0197a..4ae5cdfad2e0a 100644 --- a/docs/architecture/modernize-desktop/toc.yml +++ b/docs/architecture/modernize-desktop/toc.yml @@ -9,7 +9,7 @@ href: migrate-modern-applications.md - name: Windows 10 Migration href: windows-migration.md - - name: Example of migrating to .NET + - name: Example of migrating to .NET 5 href: example-migration.md - name: Deploying Modern Desktop Applications href: deploy-modern-applications.md From e3bce5b7b0fa00f2b58fb3baa3ce0f876da67fc4 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Tue, 5 Jan 2021 11:22:46 +0530 Subject: [PATCH 06/28] Updated title --- docs/architecture/toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/toc.yml b/docs/architecture/toc.yml index 7ae2e7c9cf721..0304995a7e05b 100644 --- a/docs/architecture/toc.yml +++ b/docs/architecture/toc.yml @@ -15,7 +15,7 @@ href: containerized-lifecycle/ - name: Modernize existing .NET applications with Azure cloud and Windows Containers href: modernize-with-azure-containers/ - - name: "Modernizing desktop apps on Windows 10 with .NET" + - name: "Modernizing desktop apps on Windows 10 with .NET 5" href: modernize-desktop/ - name: ".NET Microservices: Architecture for containerized .NET applications" href: microservices/ From 3fbcb65cf7937cf41a594009ec58f156a6305eec Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:47:44 +0530 Subject: [PATCH 07/28] Update docs/architecture/modernize-desktop/example-migration.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/example-migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 66f051f319e96..60971e38a3442 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -56,7 +56,7 @@ An interesting aspect of this tool is that it only surfaces the differences from ### Migrate project file -The easy way you can get started with the migration by using [Try Convert](https://github.com/dotnet/try-convert/releases). It's a global tool that attempts to upgrade your project file from the old style to the new SDK style and retargets applicable projects to .NET 5. Once it's installed, you can run the below commands: +The [Try Convert](https://github.com/dotnet/try-convert/releases) tool is a great way to migrate a project. It's a global tool that attempts to upgrade your project file from the old style to the new SDK style, and retargets applicable projects to .NET 5. Once installed, you can run the following commands: ```text try-convert -p "" From c9faa278d493c2fb9e926dc961a69103daed82c3 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:48:06 +0530 Subject: [PATCH 08/28] Update docs/architecture/modernize-desktop/example-migration.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/example-migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 60971e38a3442..624c015b5615e 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -58,7 +58,7 @@ An interesting aspect of this tool is that it only surfaces the differences from The [Try Convert](https://github.com/dotnet/try-convert/releases) tool is a great way to migrate a project. It's a global tool that attempts to upgrade your project file from the old style to the new SDK style, and retargets applicable projects to .NET 5. Once installed, you can run the following commands: -```text +```dotnetcli try-convert -p "" ``` From a04aed8529e0eb340b538f0ae805e5465e7a3ade Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:48:24 +0530 Subject: [PATCH 09/28] Update docs/architecture/modernize-desktop/example-migration.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/example-migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 624c015b5615e..78dd318da21fc 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -64,7 +64,7 @@ try-convert -p "" Or: -```text +```dotnetcli try-convert -w "" ``` From 86968b8c96d297e3237f2fdcb651f5f7cf191b05 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:48:32 +0530 Subject: [PATCH 10/28] Update docs/architecture/modernize-desktop/example-migration.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/example-migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 78dd318da21fc..b93f4962c50da 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -68,7 +68,7 @@ Or: try-convert -w "" ``` -After the tool completes the conversion, reload your files in Visual Studio to run and test. There's a possibility that Try Convert won't be able to perform the conversion due to the specifics of your project. In that case, you can refer the below steps. +After the tool attempts the conversion, reload your files in Visual Studio to run and test. There's a possibility that Try Convert won't be able to perform the conversion due to the specifics of your project. In that case, you can refer the below steps. #### Create the new .NET project From fb300c4c9beff1a8e7c3c0a595b1103084763803 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:48:59 +0530 Subject: [PATCH 11/28] Update docs/architecture/modernize-desktop/example-migration.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/example-migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index b93f4962c50da..d6d4ce9012a3e 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -76,7 +76,7 @@ In most of the cases, you'll want to update your existing project to the new .NE The [SDK-style project](../../core/project-sdk/msbuild-props.md) for .NET is a lot simpler than .NET Framework's project format. And apart from the previously mentioned `PackageReference` entries, you won't need to do much more. The new project format includes certain file extensions [by default](../../core/tools/csproj.md#default-compilation-includes-in-net-core-projects), such as `.cs` and `.xaml` files, without the need to explicitly include them in the project file. -#### Assembly.info considerations +#### AssemblyInfo considerations Attributes are autogenerated on .NET projects. If the project contains an *AssemblyInfo.cs* file, the definitions will be duplicated, which will cause compilation conflicts. You can delete the older *AssemblyInfo.cs* file or disable autogeneration by adding the following entry to the .NET project file: From 160bee94a4935b371ddb55b02d2d5685c7a4d3ac Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:50:13 +0530 Subject: [PATCH 12/28] Update docs/architecture/modernize-desktop/migrate-modern-applications.md Co-authored-by: David Pine --- .../modernize-desktop/migrate-modern-applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/migrate-modern-applications.md b/docs/architecture/modernize-desktop/migrate-modern-applications.md index c18f96e175a13..07342acc12034 100644 --- a/docs/architecture/modernize-desktop/migrate-modern-applications.md +++ b/docs/architecture/modernize-desktop/migrate-modern-applications.md @@ -77,7 +77,7 @@ You may also come across some issues when using configuration sections that were If you take this configuration to a .NET, you'll get an exception: -Unrecognized configuration section system.diagnostics +> Unrecognized configuration section System.Diagnostics This exception occurs because that section and the assembly responsible for handling that section was defined in the *machine.config* file, which now doesn't exist. From 5ee0545989f4bdea5417f3a16ade9265f0d5e612 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:50:23 +0530 Subject: [PATCH 13/28] Update docs/architecture/modernize-desktop/migrate-modern-applications.md Co-authored-by: David Pine --- .../modernize-desktop/migrate-modern-applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/migrate-modern-applications.md b/docs/architecture/modernize-desktop/migrate-modern-applications.md index 07342acc12034..b2ec98ad9188a 100644 --- a/docs/architecture/modernize-desktop/migrate-modern-applications.md +++ b/docs/architecture/modernize-desktop/migrate-modern-applications.md @@ -195,7 +195,7 @@ For more information on API compatibility, you can find documentation about brea Application domains (AppDomains) isolate apps from one another. AppDomains require runtime support and are expensive. Creating additional app domains isn't supported. For code isolation, we recommend separate processes or using containers as an alternative. For the dynamic loading of assemblies, we recommend the new  class. -To make code migration from .NET Framework easier, .NET exposes some of the AppDomain API surface. Some of the APIs function normally (for example, ), some members do nothing (for example, ), and some of them throw (for example, ). +To make code migration from .NET Framework easier, .NET exposes some of the `AppDomain` API surface. Some of the APIs function normally (for example, ), some members do nothing (for example, ), and some of them throw (for example, ). ### Remoting From d56f5b7513b83e058ff143aea13d07a215e1dbf1 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:51:05 +0530 Subject: [PATCH 14/28] Update docs/architecture/modernize-desktop/whats-new-dotnet.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/whats-new-dotnet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/whats-new-dotnet.md b/docs/architecture/modernize-desktop/whats-new-dotnet.md index 34304d0ce1019..647e3a44240b6 100644 --- a/docs/architecture/modernize-desktop/whats-new-dotnet.md +++ b/docs/architecture/modernize-desktop/whats-new-dotnet.md @@ -50,7 +50,7 @@ The benefits of .NET Core come from these three characteristics: Starting with .NET Core 3.0, besides the existing support for web and cloud, there's also support for desktop, IoT, and AI domains. The goal for this framework is impressive: to target every type of .NET development present and future. Microsoft plans to complete this vision with .NET 5 at the end of 2020. The "Core" name was removed to reinforce its uniqueness in the .NET world. -## .NET 5 = .NET Core vNext +## .NET 5 is .NET Core vNext .NET 5 is the next step forward with .NET Core. The .NET 5.0 aims to improve .NET in a few key ways: From 4ba27b42431fb6f6ef359b1bdd241368a07d302a Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Wed, 6 Jan 2021 16:52:17 +0530 Subject: [PATCH 15/28] Update docs/architecture/modernize-desktop/whats-new-dotnet.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/whats-new-dotnet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/whats-new-dotnet.md b/docs/architecture/modernize-desktop/whats-new-dotnet.md index 647e3a44240b6..bc9f41dfa54d0 100644 --- a/docs/architecture/modernize-desktop/whats-new-dotnet.md +++ b/docs/architecture/modernize-desktop/whats-new-dotnet.md @@ -58,7 +58,7 @@ Starting with .NET Core 3.0, besides the existing support for web and cloud, the - Expand the capabilities of .NET by taking the best of .NET Core, .NET Framework, Xamarin and Mono. - Build that product out of a single code-base that developers (Microsoft and the community) can work on and expand together and that improves all scenarios. -This new release and direction are a game-changer for .NET. With .NET 5, your code and project files will look and feel the same no matter which type of app you’re building. You’ll have access to the same runtime, API and language capabilities with each app. This includes new [performance improvements](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-2-1/) that get committed to corefx, practically daily. For more details refer [What's new in .NET 5](https://docs.microsoft.com/dotnet/core/dotnet-five). +This new release and direction are a game-changer for .NET. With .NET 5, your code and project files will look and feel the same no matter which type of app you're building. You’ll have access to the same runtime, APIs, and language capabilities with each app. This includes new [performance improvements](https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/) that get committed to the runtime, practically daily. For more details refer [What's new in .NET 5](https://docs.microsoft.com/dotnet/core/dotnet-five). ![All domains of .NET 5](./media/whats-new-dotnet-core/all-domains-of-dotnet5.png) From e83858897355c2f0d24a80d13e53117840769c7e Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Wed, 6 Jan 2021 16:55:12 +0530 Subject: [PATCH 16/28] Updated index page. --- docs/architecture/modernize-desktop/index.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/architecture/modernize-desktop/index.md b/docs/architecture/modernize-desktop/index.md index 30ec66ae6f2de..11ae338fcdcaa 100644 --- a/docs/architecture/modernize-desktop/index.md +++ b/docs/architecture/modernize-desktop/index.md @@ -1,12 +1,16 @@ --- title: Modernizing Desktop Apps on Windows 10 with .NET 5 description: Learn how to modernize existing desktop apps with .NET 5 -ms.date: 12/29/2020 +ms.date: 01/06/2021 --- # Modernizing Desktop Apps on Windows 10 with .NET 5 ![Screenshot that shows the modernize desktop apps e-book cover.](./media/modernizing-existing-desktop-apps-ebook-cover.png) +EDITION v5.0 - Updated to .NET 5 + +Refer [changelog](https://aka.ms/desktop-ebook-changelog) for the book updates and community contributions. + PUBLISHED BY Microsoft Developer Division, .NET, and Visual Studio product teams @@ -17,7 +21,7 @@ One Microsoft Way Redmond, Washington 98052-6399 -Copyright © 2020 by Microsoft Corporation +Copyright © 2021 by Microsoft Corporation All rights reserved. No part of the contents of this book may be reproduced or transmitted in any form or by any means without the written permission of the publisher. From fa4d4a73a7f62886a34b7d767f46e448b7ef0b7f Mon Sep 17 00:00:00 2001 From: Olia Gavrysh <31997351+OliaG@users.noreply.github.com> Date: Wed, 6 Jan 2021 19:42:40 -0800 Subject: [PATCH 17/28] Update example-migration.md --- .../modernize-desktop/example-migration.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index d6d4ce9012a3e..20179d7bf32cc 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -239,13 +239,13 @@ First, you must update the *.csproj* file to the new SDK style used by .NET Core In this case, delete all the content of the *.csproj* file and replace it with the following code: ```xml - - - WinExe - netcoreapp3.1 - true - false - + + + WinExe + net5.0-windows + true + false + ``` From a34b5047c60d49f73416ebb229a1a81a1dd1e922 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Thu, 7 Jan 2021 10:55:07 +0530 Subject: [PATCH 18/28] Update docs/architecture/modernize-desktop/whats-new-dotnet.md Co-authored-by: Olia Gavrysh <31997351+OliaG@users.noreply.github.com> --- docs/architecture/modernize-desktop/whats-new-dotnet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/whats-new-dotnet.md b/docs/architecture/modernize-desktop/whats-new-dotnet.md index bc9f41dfa54d0..e7aee1e0a6906 100644 --- a/docs/architecture/modernize-desktop/whats-new-dotnet.md +++ b/docs/architecture/modernize-desktop/whats-new-dotnet.md @@ -62,7 +62,7 @@ This new release and direction are a game-changer for .NET. With .NET 5, your co ![All domains of .NET 5](./media/whats-new-dotnet-core/all-domains-of-dotnet5.png) -## .NET Framework vs. .NET +## .NET Framework vs. .NET 5 So now that you understand the relevance of .NET, you might be wondering what happens with .NET Framework. You could be asking questions like: do you have to abandon it? Is it going to disappear? What are my choices to modernize the applications I have on .NET Framework? From 0ebfa3afe8bcd34deb849f44e6c706b6a42c4133 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Thu, 7 Jan 2021 10:55:21 +0530 Subject: [PATCH 19/28] Update docs/architecture/modernize-desktop/migrate-modern-applications.md Co-authored-by: Olia Gavrysh <31997351+OliaG@users.noreply.github.com> --- .../modernize-desktop/migrate-modern-applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/migrate-modern-applications.md b/docs/architecture/modernize-desktop/migrate-modern-applications.md index b2ec98ad9188a..19c92d0e378f0 100644 --- a/docs/architecture/modernize-desktop/migrate-modern-applications.md +++ b/docs/architecture/modernize-desktop/migrate-modern-applications.md @@ -184,7 +184,7 @@ Insert a `COMReference` structure inside the project file like in the following ## More things to consider -Several technologies available to .NET Framework libraries aren't available for .NET Core or later. If your code relies on some of these technologies, consider the alternative approaches outlined in this section. +Several technologies available to .NET Framework libraries aren't available for .NET Core or .NET 5. If your code relies on some of these technologies, consider the alternative approaches outlined in this section. The [Windows Compatibility Pack](../../core/porting/windows-compat-pack.md) provides access to APIs that were previously available only for .NET Framework. It can be used on .NET Core and .NET Standard projects. From e0bba768ad371bb25d7c385f8fce6f5c3c02dc0a Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Thu, 7 Jan 2021 10:55:40 +0530 Subject: [PATCH 20/28] Update docs/architecture/modernize-desktop/example-migration.md Co-authored-by: Olia Gavrysh <31997351+OliaG@users.noreply.github.com> --- docs/architecture/modernize-desktop/example-migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 20179d7bf32cc..6021c3f61a739 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -54,7 +54,7 @@ You can find more information about this tool at: An interesting aspect of this tool is that it only surfaces the differences from your own code and not code from external packages, which you can't change. Remember you should have updated most of these packages to make them work with .NET. -### Migrate project file +### Migrate with Try Convert tool The [Try Convert](https://github.com/dotnet/try-convert/releases) tool is a great way to migrate a project. It's a global tool that attempts to upgrade your project file from the old style to the new SDK style, and retargets applicable projects to .NET 5. Once installed, you can run the following commands: From 5c68cfa5bdf88f4d115de3be93335269e22bb0d1 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Thu, 7 Jan 2021 10:57:08 +0530 Subject: [PATCH 21/28] Update docs/architecture/modernize-desktop/example-migration.md Co-authored-by: Olia Gavrysh <31997351+OliaG@users.noreply.github.com> --- docs/architecture/modernize-desktop/example-migration.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 6021c3f61a739..63f713c800cf9 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -70,7 +70,8 @@ try-convert -w "" After the tool attempts the conversion, reload your files in Visual Studio to run and test. There's a possibility that Try Convert won't be able to perform the conversion due to the specifics of your project. In that case, you can refer the below steps. -#### Create the new .NET project +#### Migrate manually +1. Create the new .NET project In most of the cases, you'll want to update your existing project to the new .NET format. However, you can also create a new project while maintaining the old one. The main drawback from updating the old project is that you lose designer support, which may be important for you. If you want to keep using the designer, you must create a new .NET project in parallel with the old one and share assets. If you need to modify UI elements in the designer, you can switch to the old project to do that. And since assets are linked, they'll be updated in the .NET project as well. From f676c2a67f88cce839548dfb7a5af523d944d93a Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Thu, 7 Jan 2021 11:01:47 +0530 Subject: [PATCH 22/28] Fixed lint error. --- docs/architecture/modernize-desktop/example-migration.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 63f713c800cf9..3137d386b178a 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -71,6 +71,7 @@ try-convert -w "" After the tool attempts the conversion, reload your files in Visual Studio to run and test. There's a possibility that Try Convert won't be able to perform the conversion due to the specifics of your project. In that case, you can refer the below steps. #### Migrate manually + 1. Create the new .NET project In most of the cases, you'll want to update your existing project to the new .NET format. However, you can also create a new project while maintaining the old one. The main drawback from updating the old project is that you lose designer support, which may be important for you. If you want to keep using the designer, you must create a new .NET project in parallel with the old one and share assets. If you need to modify UI elements in the designer, you can switch to the old project to do that. And since assets are linked, they'll be updated in the .NET project as well. From 34550d6c49b0ca7d8f370e4c37dba12fa553d573 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Fri, 8 Jan 2021 14:46:20 +0530 Subject: [PATCH 23/28] Updated cover page. --- ...zing-existing-desktop-apps-ebook-cover.png | Bin 34262 -> 66597 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/architecture/modernize-desktop/media/modernizing-existing-desktop-apps-ebook-cover.png b/docs/architecture/modernize-desktop/media/modernizing-existing-desktop-apps-ebook-cover.png index 32a672655c697ddd7e43dbd19c9b5de7fdaafe94..f65074a44dd4df333449ebe02f0a8fda7262d971 100644 GIT binary patch literal 66597 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 literal 34262 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 hjZ?^4i`i$eoF*n1bJyTb`K@Pf{ug)J#u5Mk From 9a711d8c2a41056ee9ce6237dff2a13de93ec6b7 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Fri, 8 Jan 2021 14:53:54 +0530 Subject: [PATCH 24/28] Updated edition as per the cover page. --- docs/architecture/modernize-desktop/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/index.md b/docs/architecture/modernize-desktop/index.md index 11ae338fcdcaa..4e1b2e6e21d7f 100644 --- a/docs/architecture/modernize-desktop/index.md +++ b/docs/architecture/modernize-desktop/index.md @@ -7,7 +7,7 @@ ms.date: 01/06/2021 ![Screenshot that shows the modernize desktop apps e-book cover.](./media/modernizing-existing-desktop-apps-ebook-cover.png) -EDITION v5.0 - Updated to .NET 5 +**EDITION v1.0.1** - Updated to .NET 5 Refer [changelog](https://aka.ms/desktop-ebook-changelog) for the book updates and community contributions. From 9bca24e4d255bc4327ffa0ba088ad3f03aeb62d3 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Mon, 11 Jan 2021 11:29:49 +0530 Subject: [PATCH 25/28] Update docs/architecture/modernize-desktop/index.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/index.md b/docs/architecture/modernize-desktop/index.md index 4e1b2e6e21d7f..afde2265789f6 100644 --- a/docs/architecture/modernize-desktop/index.md +++ b/docs/architecture/modernize-desktop/index.md @@ -73,7 +73,7 @@ Microsoft's approach to modernizing existing applications is to give you the fle ## Who should use the book -We wrote this book for developers and solution architects who want to modernize existing Windows Forms and WPF desktop applications to leverage the benefits of .NET and Windows 10. +This book for developers and solution architects who want to modernize existing Windows Forms and WPF desktop applications to leverage the benefits of .NET and Windows 10. You might also find this book useful if you're a technical decision maker, such as an enterprise architect or a development lead or director who wants an overview of the benefits of updating existing desktop applications. From edf9d7b5b987cd14ef02dab87ac3181063201f80 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Tue, 19 Jan 2021 21:04:55 +0530 Subject: [PATCH 26/28] Rephrased the sentence. --- .../modernize-desktop/migrate-modern-applications.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/architecture/modernize-desktop/migrate-modern-applications.md b/docs/architecture/modernize-desktop/migrate-modern-applications.md index 19c92d0e378f0..be63f30e7b9ef 100644 --- a/docs/architecture/modernize-desktop/migrate-modern-applications.md +++ b/docs/architecture/modernize-desktop/migrate-modern-applications.md @@ -1,7 +1,7 @@ --- title: Migrating Modern Desktop applications description: Everything you need to know about the migration process for modern desktop applications. -ms.date: 12/29/2020 +ms.date: 01/19/2021 --- # Migrating Modern Desktop applications @@ -50,7 +50,7 @@ You can continue to use your existing app.config XML file. However, you could ta To migrate from an old-style *app.config* to a new configuration file, you should choose between an XML format and a JSON format. -If you choose XML, the conversion is straightforward. Since the content is the same, just rename the *app.config* file to a file with XML extension. Then, change the code that references AppSettings to use the `ConfigurationBuilder` class. This change should be easy. +If you choose XML, the conversion is straightforward. Since the content is the same, just save the *app.config* file with XML as type. Then, change the code that references AppSettings to use the `ConfigurationBuilder` class. This change should be easy. If you want to use a JSON format and you don't want to migrate by hand, there's a tool called [dotnet-config2json](https://www.nuget.org/packages/dotnet-config2json/) available on .NET that can convert an *app.config* file to a JSON configuration file. From 75ee95758bf340d2ee27e43f2c25f72ec0e51a95 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh Date: Tue, 19 Jan 2021 21:11:26 +0530 Subject: [PATCH 27/28] Update docs/architecture/modernize-desktop/example-migration.md Co-authored-by: David Pine --- docs/architecture/modernize-desktop/example-migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index 3137d386b178a..a3a79a063ebb7 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -74,7 +74,7 @@ After the tool attempts the conversion, reload your files in Visual Studio to ru 1. Create the new .NET project -In most of the cases, you'll want to update your existing project to the new .NET format. However, you can also create a new project while maintaining the old one. The main drawback from updating the old project is that you lose designer support, which may be important for you. If you want to keep using the designer, you must create a new .NET project in parallel with the old one and share assets. If you need to modify UI elements in the designer, you can switch to the old project to do that. And since assets are linked, they'll be updated in the .NET project as well. +In most cases, you'll want to update your existing project to the new .NET format. However, you can also create a new project while maintaining the old one. The main drawback from updating the old project is that you lose designer support, which may be important to you and your development team. If you want to keep using the designer, you must create a new .NET project in parallel with the old one and share assets. If you need to modify UI elements in the designer, you can switch to the old project to do that. And since assets are linked, they'll be updated in the .NET project as well. The [SDK-style project](../../core/project-sdk/msbuild-props.md) for .NET is a lot simpler than .NET Framework's project format. And apart from the previously mentioned `PackageReference` entries, you won't need to do much more. The new project format includes certain file extensions [by default](../../core/tools/csproj.md#default-compilation-includes-in-net-core-projects), such as `.cs` and `.xaml` files, without the need to explicitly include them in the project file. From af093286bf6cf1153813a7fa9444103abf11f837 Mon Sep 17 00:00:00 2001 From: Sumit Ghosh <13281246+sughosneo@users.noreply.github.com> Date: Tue, 19 Jan 2021 21:12:35 +0530 Subject: [PATCH 28/28] Updated page. --- docs/architecture/modernize-desktop/example-migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/modernize-desktop/example-migration.md b/docs/architecture/modernize-desktop/example-migration.md index ea28286265cc9..a5869ebfc43e5 100644 --- a/docs/architecture/modernize-desktop/example-migration.md +++ b/docs/architecture/modernize-desktop/example-migration.md @@ -1,7 +1,7 @@ --- title: Example of migrating to .NET 5 description: Showing how to migrate a sample applications targeting .NET Framework to .NET 5. -ms.date: 12/29/2020 +ms.date: 01/19/2021 --- # Example of migrating to .NET