Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/prompts/error-consolidation.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ Overall steps:
1. Run Copilot search for other existing errors that person may have missed.
1. Search for missing errors.

## Add a single existing file into the new consolidated article.
## Add a single existing file into the new consolidated article.

We're going to work through a series of files consolidating errors and warnings related to declaring overloaded operators.
We're going to work through a series of files consolidating errors and warnings related to declaring the `dynamic` type and dynamic binding.

The destination for all these edits is the overloaded-operator-errors.md file. It already contains a skeleton for the final output.
The destination for all these edits is the dynamic-type-and-binding-errors.md file. It already contains a skeleton for the final output.

For each source file I specify in this chat, you'll do the following tasks:

Expand All @@ -28,7 +28,7 @@ For each source file I specify in this chat, you'll do the following tasks:

## Search for other related articles that may be missed.

Search all files in the docs/csharp/language-reference/compiler-messages and the docs/csharp/misc folder for any other errors and warnings that involve operator overloading. Give me a list to review for possible additional consolidation. Don't make any edits until the originating user approves.
Search all files in the docs/csharp/language-reference/compiler-messages and the docs/csharp/misc folder for any other errors and warnings that involve the `dynamic` type or dynamic binding. Give me a list to review for possible additional consolidation. Don't make any edits until the originating user approves.

## Final search in roslyn source

Expand All @@ -51,7 +51,7 @@ Note that no redirections need to be added for these error codes.

## Build consolidated sections

For all remaining work, all edits will be in the `overloaded-operator-errors.md` file. The final format should mirror the structure of the `preprocessor-errors.md` file. Every H2 is a theme, all anchors are for the theme, not an individual error code.
For all remaining work, all edits will be in the `dynamic-type-and-binding-errors.md` file. The final format should mirror the structure of the `preprocessor-errors.md` file. Every H2 is a theme, all anchors are for the theme, not an individual error code.

To do that, make a new H2 section for the theme. Remove all the H2s for the individual error codes that are part of that theme. Where applicable, the new H2 can include text or examples from the H2s you remove. The new section should include links to language reference articles that discuss the feature or theme.

Expand Down
47 changes: 47 additions & 0 deletions docs/core/deploying/macos.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
title: Publish .NET apps for macOS
description: Learn how to publish .NET applications for macOS, including signing, notarization, and app entitlements.
author: agocke
ms.author: angocke
ms.date: 10/22/2025
ms.topic: how-to
ai-usage: ai-assisted
---

# Publish .NET apps for macOS

Publishing .NET applications for macOS requires several additional steps compared to other platforms, due to Apple's security requirements.

## Prerequisites

Before you publish your .NET application for macOS, ensure you have the following:

- **Apple Developer Account**: Needed for code signing and notarization.
- **Xcode Command Line Tools**: Provides `codesign`, `altool`, and other utilities.
- **.NET SDK**: Ensure you have the latest .NET SDK installed.

## Produce your app using .NET SDK

Use one of the methods described in the [.NET application publishing overview](/dotnet/core/deploying/) to produce an application. You can create either a framework-dependent or self-contained application.

## Sign and notarize your app

Use [Apple's developer documentation](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution) to sign and notarize the app native binaries. .NET creates a native *apphost* executable as the entry point for your app. This apphost must be signed and, if your app uses special capabilities, it must be assigned the appropriate **entitlements**.

### Entitlements for apps not published as Native AOT

For apps not published as [Native AOT](native-aot/index.md), the `com.apple.security.cs.allow-jit` entitlement is required.

### Entitlements for apps published as Native AOT

For apps published as [Native AOT](native-aot/index.md), no entitlements are required.

### Optional entitlements for debugging and diagnostics

The following entitlements enable additional debugging and diagnostic capabilities:

- **`com.apple.security.get-task-allow`**: Needed for dump collection with `createdump` and `dotnet dump`.
- **`com.apple.security.cs.debugger`**: Needed to attach a debugger to the process.

> [!WARNING]
> Failing to sign and notarize your app might result in the application crashing while executing a restricted operation.
34 changes: 17 additions & 17 deletions docs/core/tutorials/cli-templates-create-item-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ title: Create an item template for dotnet new - .NET CLI
titleSuffix: ""
description: Learn how to create an item template for the dotnet new command. Item templates can contain any number of files.
author: adegeo
ms.date: 09/08/2023
ms.date: 10/23/2025
ai-usage: ai-assisted
ms.topic: tutorial
ms.author: adegeo
---
Expand All @@ -17,7 +18,7 @@ You can view the completed template in the [.NET Samples GitHub repository](http
> [!TIP]
> **Item** templates aren't shown in the **Add** > **New Item** dialog of Visual Studio.

In this part of the series, you'll learn how to:
In this part of the series, you learn how to:

> [!div class="checklist"]
>
Expand All @@ -29,13 +30,11 @@ In this part of the series, you'll learn how to:

## Prerequisites

* [.NET SDK 7.0.100](https://dotnet.microsoft.com/download) or a later version.
- [.NET 9](https://dotnet.microsoft.com/download) or a later version.

The reference article explains the basics about templates and how they're put together. Some of this information is reiterated here.
- The reference article explains the basics about templates and how they're put together. Some of this information is reiterated here.

* Open a terminal and navigate to a folder where you'll store and test the templates.

[!INCLUDE [dotnet6-syntax-note](includes/dotnet6-syntax-note.md)]
- Open a terminal and navigate to a folder where you'll store and test the templates.

## Create the required folders

Expand All @@ -54,7 +53,7 @@ parent_folder

## Create an item template

An item template is a specific type of template that contains one or more files. These types of templates are useful when you already have a project and you want to generate another file, like a config file or code file. In this example, you'll create a class that adds an extension method to the string type.
An item template is a specific type of template that contains one or more files. These types of templates are useful when you already have a project and you want to generate another file, like a config file or code file. In this example, you create a class that adds an extension method to the string type.

In your terminal, navigate to the _working\content_ folder and create a new subfolder named _extensions_.

Expand All @@ -64,7 +63,7 @@ working
└───extensions
```

Navigate to the _extensions_ folder and create a new file named _StringExtensions.cs_. Open the file in a text editor. This class will provide an extension method named `Reverse` that reverses the contents of a string. Paste in the following code and save the file:
Navigate to the _extensions_ folder and create a new file named _StringExtensions.cs_. Open the file in a text editor. This class provides an extension method named `Reverse` that reverses the contents of a string. Paste in the following code and save the file:

```csharp
namespace System;
Expand All @@ -80,7 +79,7 @@ public static class StringExtensions
}
```

Now that the content of the template is finished, the next step is to create the template config.
Now that the content of the template is finished, create the template config.

## Create the template config

Expand Down Expand Up @@ -171,7 +170,7 @@ Template options:
Default: StringExtensions
```

Now that you have a valid _.template.config/template.json_ file, your template is ready to be installed. In your terminal, navigate to the _extensions_ folder and run the following command to install the template located at the current folder:
Now that you have a valid _.template.config/template.json_ file, your template is ready to be installed. In your terminal, navigate to the _extensions_ folder and run the following command to install the template located at the current folder:

* **On Windows**: `dotnet new install .\`
* **On Linux or macOS**: `dotnet new install ./`
Expand All @@ -192,8 +191,9 @@ Example templates: string extensions stringext [C#]

Now that you have an item template installed, test it.

01. Navigate to the _test_ folder.
01. Create a new console application with `dotnet new console`, which generates a working project you can easily test with the `dotnet run` command.
1. Navigate to the _test_ folder.

1. Create a new console application with `dotnet new console`, which generates a working project you can easily test with the `dotnet run` command.

```dotnetcli
dotnet new console
Expand All @@ -211,7 +211,7 @@ Now that you have an item template installed, test it.
Restore succeeded.
```

01. Run the project using the following command.
1. Run the project using the following command.

```dotnetcli
dotnet run
Expand All @@ -223,7 +223,7 @@ Now that you have an item template installed, test it.
Hello, World!
```

01. Run `dotnet new stringext` to generate the _StringExtensions.cs_ file from the template.
1. Run `dotnet new stringext` to generate the _StringExtensions.cs_ file from the template.

```dotnetcli
dotnet new stringext
Expand All @@ -235,7 +235,7 @@ Now that you have an item template installed, test it.
The template "Example templates: string extensions" was created successfully.
```

01. Change the code in _Program.cs_ to reverse the `"Hello, World!"` string with the extension method provided by the template.
1. Change the code in _Program.cs_ to reverse the `"Hello, World!"` string with the extension method provided by the template.

```csharp
Console.WriteLine("Hello, World!".Reverse());
Expand All @@ -257,7 +257,7 @@ Congratulations! You created and deployed an item template with .NET. In prepara

## Uninstall the template

In your terminal, navigate to the _extensions_ folder and run the following command to uninstall the templates located at the current folder:
In your terminal, navigate to the _extensions_ folder and run the following command to uninstall the templates located at the current folder:

* **On Windows**: `dotnet new uninstall .\`
* **On Linux or macOS**: `dotnet new uninstall ./`
Expand Down
18 changes: 10 additions & 8 deletions docs/core/tutorials/cli-templates-create-project-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
title: Create a project template for dotnet new
description: Learn how to create a project template for the dotnet new command.
author: adegeo
ms.date: 09/08/2023
ms.date: 10/23/2025
ai-usage: ai-assisted
ms.topic: tutorial
ms.author: adegeo
---

# Tutorial: Create a project template

With .NET, you can create and deploy templates that generate projects, files, even resources. This tutorial is part two of a series that teaches you how to create, install, and uninstall, templates for use with the `dotnet new` command.
With .NET, you can create and deploy templates that generate projects, files, and resources. This tutorial is part two of a series that teaches you how to create, install, and uninstall templates for use with the `dotnet new` command.

> [!TIP]
> The official .NET templates that are shipped with the .NET SDK can be found in the following repositories:
Expand All @@ -26,7 +27,7 @@ With .NET, you can create and deploy templates that generate projects, files, ev
>
> You can view the templates that are installed on your machine by running the `dotnet new list` command.

In this part of the series you'll learn how to:
In this part of the series, you learn how to:

> [!div class="checklist"]
>
Expand All @@ -38,16 +39,17 @@ In this part of the series you'll learn how to:

## Prerequisites

* Complete [part 1](cli-templates-create-item-template.md) of this tutorial series.
* Open a terminal and navigate to the _working\content_ folder.
- [.NET 9](https://dotnet.microsoft.com/download) or a later version.

[!INCLUDE [dotnet6-syntax-note](includes/dotnet6-syntax-note.md)]
- Complete [part 1](cli-templates-create-item-template.md) of this tutorial series.

- Open a terminal and navigate to the _working\content_ folder.

## Create a project template

Project templates produce ready-to-run projects that make it easy for users to start with a working set of code. .NET includes a few project templates such as a console application or a class library. In this example, you create a new console application project that replaces the standard "Hello World" console output with one that runs asynchronously.

In your terminal, navigate to the _working\content_ folder and create a new subfolder named _consoleasync_. Enter the subfolder and run `dotnet new console` to generate the standard console application. You'll edit the files produced by this template to create a new template.
In your terminal, navigate to the _working\content_ folder and create a new subfolder named _consoleasync_. Enter the subfolder and run `dotnet new console` to generate the standard console application. Edit the files produced by this template to create a new template.

```console
working
Expand All @@ -59,7 +61,7 @@ working

## Modify Program.cs

Open up the _Program.cs_ file. The standard console project doesn't asynchronously write to the console output, so let's add that. Change the code to the following and save the file:
Open up the _Program.cs_ file. The standard console project doesn't asynchronously write to the console output, so add that. Change the code to the following and save the file:

```csharp
// See https://aka.ms/new-console-template for more information
Expand Down
23 changes: 12 additions & 11 deletions docs/core/tutorials/cli-templates-create-template-package.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@
title: Create a template package for dotnet new
description: Learn how to create a csproj file that builds a template package for the dotnet new command.
author: adegeo
ms.date: 09/11/2023
ms.date: 10/23/2025
ai-usage: ai-assisted
ms.topic: tutorial
ms.author: adegeo
---

# Tutorial: Create a template package

With .NET, you can create and deploy templates that generate projects, files, and even resources. This tutorial is part three of a series that teaches you how to create, install, and uninstall templates for use with the `dotnet new` command.
With .NET, you can create and deploy templates that generate projects, files, and resources. This tutorial is part three of a series that teaches you how to create, install, and uninstall templates for use with the `dotnet new` command.

You can view the completed template in the [.NET Samples GitHub repository](https://github.com/dotnet/samples/tree/main/core/tutorials/cli-templates-create-item-template).

In this part of the series you'll learn how to:
In this part of the series, you learn how to:

> [!div class="checklist"]
>
Expand All @@ -23,16 +24,16 @@ In this part of the series you'll learn how to:

## Prerequisites

* Complete [part 1](cli-templates-create-item-template.md) and [part 2](cli-templates-create-project-template.md) of this tutorial series.
- [.NET 9](https://dotnet.microsoft.com/download) or a later version.

This tutorial uses the two templates created in the first two parts of this tutorial series. You can use a different template as long as you copy the template, as a folder, into the _working\content_ folder.
- Complete [part 1](cli-templates-create-item-template.md) and [part 2](cli-templates-create-project-template.md) of this tutorial series.

* Open a terminal and navigate to the _working_ folder.
This tutorial uses the two templates created in the first two parts of this tutorial series. You can use a different template as long as you copy the template, as a folder, into the _working\content_ folder.

* Install .NET 8 or .NET 9.
* Install the `Microsoft.TemplateEngine.Authoring.Templates` template from the NuGet package feed.
- Open a terminal and navigate to the _working_ folder.

* Run the `dotnet new install Microsoft.TemplateEngine.Authoring.Templates` command from your terminal.
- Install the `Microsoft.TemplateEngine.Authoring.Templates` template from the NuGet package feed.
- Run the `dotnet new install Microsoft.TemplateEngine.Authoring.Templates` command from your terminal.

## Create a template package project

Expand All @@ -42,11 +43,11 @@ Template packages are represented by a NuGet package (_.nupkg_) file. And, like

Normally you use a C# project file to compile code and produce a binary. However, the project can also be used to generate a template package. By changing the settings of the _.csproj_, you can prevent it from compiling any code and instead include all the assets of your templates as resources. When this project is built, it produces a template package NuGet package.

The package you're going to generate will include the [item](cli-templates-create-item-template.md) and [project](cli-templates-create-project-template.md) templates previously created.
The package you're going to generate includes the [item](cli-templates-create-item-template.md) and [project](cli-templates-create-project-template.md) templates previously created.

The [Microsoft.TemplateEngine.Authoring.Templates](https://www.nuget.org/packages/Microsoft.TemplateEngine.Authoring.Templates) package contains templates useful for template authoring. To install this package, nuget.org should be available as NuGet feed in the working directory.

01. In the _working_ folder, run the following command to create the template package:
1. In the _working_ folder, run the following command to create the template package:

```dotnetcli
dotnet new templatepack -n "AdatumCorporation.Utility.Templates"
Expand Down
24 changes: 8 additions & 16 deletions docs/core/tutorials/creating-app-with-plugin-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,16 +157,12 @@ static IEnumerable<ICommand> CreateCommands(Assembly assembly)
{
int count = 0;

foreach (Type type in assembly.GetTypes())
foreach (var type in assembly.GetTypes().Where(t => typeof(ICommand).IsAssignableFrom(t)))
{
if (typeof(ICommand).IsAssignableFrom(type))
if (Activator.CreateInstance(type) is ICommand result)
{
ICommand result = Activator.CreateInstance(type) as ICommand;
if (result != null)
{
count++;
yield return result;
}
count++;
yield return result;
}
}

Expand Down Expand Up @@ -194,17 +190,13 @@ Now that the `AppWithPlugin` project has the `PluginLoadContext` type, update th
static Assembly LoadPlugin(string relativePath)
{
// Navigate up to the solution root
string root = Path.GetFullPath(Path.Combine(
Path.GetDirectoryName(
Path.GetDirectoryName(
Path.GetDirectoryName(
Path.GetDirectoryName(
Path.GetDirectoryName(typeof(Program).Assembly.Location)))))));
string root = Path.GetFullPath(
Path.Combine(typeof(Program).Assembly.Location, "..", "..", "..", "..", ".."));

string pluginLocation = Path.GetFullPath(Path.Combine(root, relativePath.Replace('\\', Path.DirectorySeparatorChar)));
Console.WriteLine($"Loading commands from: {pluginLocation}");
PluginLoadContext loadContext = new PluginLoadContext(pluginLocation);
return loadContext.LoadFromAssemblyName(new AssemblyName(Path.GetFileNameWithoutExtension(pluginLocation)));
PluginLoadContext loadContext = new(pluginLocation);
return loadContext.LoadFromAssemblyName(new(Path.GetFileNameWithoutExtension(pluginLocation)));
}
```

Expand Down
Loading
Loading