diff --git a/README.md b/README.md
index 64ef03608..604818b0a 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,10 @@
-# RSCG - 239 Examples of Roslyn Source Code Generators / 15 created by Microsoft /
+# RSCG - 240 Examples of Roslyn Source Code Generators / 16 created by Microsoft /
-The RSCG_Examples repository is a comprehensive documentation system that automatically processes and showcases 239 Roslyn Source Code Generator (RSCG) examples. The system transforms individual RSCG projects into structured documentation with code examples and cross-referenced content with a searchable website and code example exports.
+The RSCG_Examples repository is a comprehensive documentation system that automatically processes and showcases 240 Roslyn Source Code Generator (RSCG) examples. The system transforms individual RSCG projects into structured documentation with code examples and cross-referenced content with a searchable website and code example exports.
This system serves as both a learning resource for .NET developers interested in source generators and an automated pipeline for maintaining up-to-date documentation about the RSCG ecosystem
-## Latest Update : 2025-11-08 => 08 November 2025
+## Latest Update : 2025-11-09 => 09 November 2025
If you want to see examples with code, please click ***[List V2](https://ignatandrei.github.io/RSCG_Examples/v2/docs/List-of-RSCG)***
@@ -24,8 +24,32 @@ If you want to be notified each time I add a new RSCG example , please click htt
## Content
-Those are the 239 Roslyn Source Code Generators that I have tested you can see and download source code example.
-( including 15 from Microsoft )
+Those are the 240 Roslyn Source Code Generators that I have tested you can see and download source code example.
+( including 16 from Microsoft )
+### 240. [XmlCommentGenerator](https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator) , in the [API](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#api) category
+
+Generated on : 2025-11-09 => 09 November 2025
+
+
+ Expand
+
+
+
+Author: Microsoft
+
+Provides APIs for annotating route handler endpoints in ASP.NET Core with OpenAPI annotations.
+
+This package was built from the source code at https://github.com/dotnet/aspnetcore/tree/e77cb01b5529c137130757859f09f892dbdd2436
+
+Nuget: [https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/](https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/)
+
+
+Link: [https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator](https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator)
+
+Source: [https://github.com/dotnet/dotnet/](https://github.com/dotnet/dotnet/)
+
+
+
### 239. [TUnit](https://ignatandrei.github.io/RSCG_Examples/v2/docs/TUnit) , in the [Tests](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#tests) category
Generated on : 2025-11-08 => 08 November 2025
diff --git a/later.md b/later.md
index 4830274f6..115577914 100644
--- a/later.md
+++ b/later.md
@@ -1,6 +1,6 @@
# Just later
-## Latest Update : 2025-11-08 => 08 November 2025
+## Latest Update : 2025-11-09 => 09 November 2025
diff --git a/v2/.tours/XmlCommentGenerator.tour b/v2/.tours/XmlCommentGenerator.tour
new file mode 100644
index 000000000..c3a89eaf4
--- /dev/null
+++ b/v2/.tours/XmlCommentGenerator.tour
@@ -0,0 +1,30 @@
+
+{
+ "$schema": "https://aka.ms/codetour-schema",
+ "title": "XmlCommentGenerator",
+ "steps":
+ [
+ {
+ "file": "rscg_examples/XmlCommentGenerator/src/TestProgram/TestProgram.csproj",
+ "description": "First, we add Nuget [Microsoft.AspNetCore.OpenApi](https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/) in csproj ",
+ "pattern": "Microsoft.AspNetCore.OpenApi"
+ }
+
+ ,{
+ "file": "rscg_examples/XmlCommentGenerator/src/TestProgram/Program.cs",
+ "description": "File Program.cs \r\n>> dotnet run --project rscg_examples/XmlCommentGenerator/src/TestProgram/TestProgram.csproj ",
+ "pattern": "this is the code"
+ }
+
+
+ ,{
+ "file": "rscg_examples/XmlCommentGenerator/src/TestProgram/obj/GX/Microsoft.AspNetCore.OpenApi.SourceGenerators/Microsoft.AspNetCore.OpenApi.SourceGenerators.XmlCommentGenerator/OpenApiXmlCommentSupport.generated.cs",
+ "description": "Generated File 1 from 1 : OpenApiXmlCommentSupport.generated.cs ",
+ "line": 1
+ }
+
+ ],
+
+ "ref": "main"
+
+}
\ No newline at end of file
diff --git a/v2/Generator/MultiGeneratorV2.cs b/v2/Generator/MultiGeneratorV2.cs
index 5b708be45..69a3f495f 100644
--- a/v2/Generator/MultiGeneratorV2.cs
+++ b/v2/Generator/MultiGeneratorV2.cs
@@ -145,6 +145,7 @@ public string[] SourceNoRSCG()
text = text.Replace("(di.gif)", $"({d.Generator!.Source}/di.gif)");
text = text.Replace("(./docs/", $"({d.Generator!.Source}/docs/");
+ text = text.Replace("(/docs/", $"({d.Generator!.Source}/docs/");
text = text.Replace("(doc/", $"({d.Generator!.Source}/doc/");
text = text.Replace("(docs/rules/", $"({d.Generator!.Source}/docs/rules/");
diff --git a/v2/Generator/all.csv b/v2/Generator/all.csv
index 1f3be3649..0f9cb6cad 100644
--- a/v2/Generator/all.csv
+++ b/v2/Generator/all.csv
@@ -238,3 +238,4 @@ Nr,Key,Source,Category
237,Program, https://github.com/dotnet/aspnetcore/,EnhancementClass
238,TeCLI, https://github.com/tyevco/TeCLI,CommandLine
239,TUnit, https://github.com/thomhurst/TUnit,Tests
+240,XmlCommentGenerator, https://github.com/dotnet/dotnet/,API
diff --git a/v2/RSCGExamplesData/GeneratorDataRec.json b/v2/RSCGExamplesData/GeneratorDataRec.json
index 97adfe9a2..df066e2f1 100644
--- a/v2/RSCGExamplesData/GeneratorDataRec.json
+++ b/v2/RSCGExamplesData/GeneratorDataRec.json
@@ -1447,5 +1447,11 @@
"Category":13,
"dtStart": "2025-11-08T00:00:00",
"show": true
+},
+{
+ "ID":"XmlCommentGenerator",
+ "Category":15,
+ "dtStart": "2025-11-09T00:00:00",
+ "show": true
}
]
\ No newline at end of file
diff --git a/v2/book/examples/XmlCommentGenerator.html b/v2/book/examples/XmlCommentGenerator.html
new file mode 100644
index 000000000..5690a3998
--- /dev/null
+++ b/v2/book/examples/XmlCommentGenerator.html
@@ -0,0 +1,53 @@
+
+
RSCG nr 240 : XmlCommentGenerator
+
+Info
+Nuget : https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/
+
+You can find more details at : https://dotnet.microsoft.com/en-us/apps/aspnet
+
+Author :Microsoft
+
+Source: https://github.com/dotnet/dotnet/
+
+About
+
+Adding Xml comments to generated OpenAPI documentation
+
+
+ How to use
+
+
+ Add reference to the XmlCommentGenerator in the csproj
+
+
+
+This was for me the starting code
+
+
+ I have coded the file Program.cs
+
+
+
+ And here are the generated files
+
+
+ The file generated is OpenApiXmlCommentSupport.generated.cs
+
+
+
+
+ You can download the code and this page as pdf from
+
+ https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator
+
+
+
+
+
+ You can see the whole list at
+
+ https://ignatandrei.github.io/RSCG_Examples/v2/docs/List-of-RSCG
+
+
+
diff --git a/v2/book/list.html b/v2/book/list.html
index ebcfcfa0e..82d089792 100644
--- a/v2/book/list.html
+++ b/v2/book/list.html
@@ -17,7 +17,7 @@
-This is the list of 239 RSCG with examples =>
+This is the list of 240 RSCG with examples =>
diff --git a/v2/book/pandocHTML.yaml b/v2/book/pandocHTML.yaml
index 4b5c4ccd4..5eac068bd 100644
--- a/v2/book/pandocHTML.yaml
+++ b/v2/book/pandocHTML.yaml
@@ -253,6 +253,7 @@ input-files:
- examples/Program.html
- examples/TeCLI.html
- examples/TUnit.html
+- examples/XmlCommentGenerator.html
# or you may use input-file: with a single value
# defaults:
diff --git a/v2/rscg_examples/XmlCommentGenerator/description.json b/v2/rscg_examples/XmlCommentGenerator/description.json
new file mode 100644
index 000000000..63682d962
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/description.json
@@ -0,0 +1,24 @@
+{
+ "generator":{
+ "name":"XmlCommentGenerator",
+ "nuget":[
+ "https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/"
+ ],
+ "link":"https://dotnet.microsoft.com/en-us/apps/aspnet",
+ "author":"Microsoft",
+ "source":"https://github.com/dotnet/dotnet/"
+ },
+ "data":{
+ "goodFor":["Adding Xml comments to generated OpenAPI documentation"],
+ "csprojDemo":"TestProgram.csproj",
+ "csFiles":["Program.cs"],
+ "excludeDirectoryGenerated":["Microsoft.AspNetCore.App.SourceGenerators",
+ "Microsoft.AspNetCore.Http.RequestDelegateGenerator",
+ "System.Text.Json.SourceGeneration"],
+ "includeAdditionalFiles":[""]
+ },
+ "links":{
+ "blog":"",
+ "video":""
+ }
+}
\ No newline at end of file
diff --git a/v2/rscg_examples/XmlCommentGenerator/nuget.txt b/v2/rscg_examples/XmlCommentGenerator/nuget.txt
new file mode 100644
index 000000000..e56440659
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/nuget.txt
@@ -0,0 +1,3 @@
+Provides APIs for annotating route handler endpoints in ASP.NET Core with OpenAPI annotations.
+
+This package was built from the source code at https://github.com/dotnet/aspnetcore/tree/e77cb01b5529c137130757859f09f892dbdd2436
\ No newline at end of file
diff --git a/v2/rscg_examples/XmlCommentGenerator/readme.txt b/v2/rscg_examples/XmlCommentGenerator/readme.txt
new file mode 100644
index 000000000..4b35b1770
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/readme.txt
@@ -0,0 +1,227 @@
+# dotnet/dotnet - Home of the .NET VMR
+
+This repository is a **Virtual Monolithic Repository (VMR)** which includes all the source code and infrastructure needed to build the .NET SDK.
+
+What this means:
+
+- **Monolithic** - a join of multiple repositories that make up the whole product, such as [dotnet/runtime](https://github.com/dotnet/runtime) or [dotnet/sdk](https://github.com/dotnet/sdk).
+- **Virtual** - a mirror (not replacement) of product repos where sources from those repositories are synchronized with.
+
+In the VMR, you can find:
+
+- source files of each product repository which are mirrored inside of their respective directories under [`src/`](https://github.com/dotnet/dotnet/tree/main/src),
+- tooling that enables [building the whole .NET product from source](https://github.com/dotnet/source-build) on Linux platforms,
+- *[in future]* E2E tests for the whole .NET product.
+
+Just like the development repositories, the VMR will have a release branch for every feature band (e.g. `release/10.0.1xx`).
+Similarly, VMR's `main` branch will follow default branches of product repositories (see [Synchronization Based on Declared Dependencies](docs/VMR-Design-And-Operation.md#synchronization-based-on-declared-dependencies)).
+
+More in-depth documentation about the VMR can be found in [VMR Design And Operation](docs/VMR-Design-And-Operation.md#layout).
+See also [dotnet/source-build](https://github.com/dotnet/source-build) for more information about our whole-product source-build.
+
+## Installing the SDK
+
+You can download the .NET SDK either as an installer (MSI, PKG) or as an archive (zip, tar.gz). The .NET SDK contains both the .NET runtimes and CLI tools.
+
+- [**Latest builds table**](docs/builds-table.md)
+
+## Goals
+
+- The main purpose of the [dotnet/dotnet](https://github.com/dotnet/dotnet) repository is to have all source code necessary to build the .NET product available in one repository and identified by a single commit.
+- The VMR also aims to become the place from which we release and service future versions of .NET to reduce the complexity of the product construction process. This should allow our partners and and 3rd parties to easily build, test and modify .NET using their custom infrastructure as well as make the process available to the community.
+- Lastly, we hope to solve other problems that the current multi-repo setup brings:
+ - Enable the standard [down-/up-stream open-source model](docs/VMR-Upstream-Downstream.md).
+ - Fulfill requirements of .NET distro builders such as RedHat or Canonical to natively include .NET in their distribution repositories.
+ - Simplify scenarios such as client-run testing of bug fixes and improvements. The build should work in an offline environment too for certain platforms.
+ - Enable developers to make and test changes spanning multiple repositories.
+ - More efficient pipeline for security fixes during the CVE pre-disclosure process.
+
+We will achieve these goals while keeping active coding work in the separate repos where it happens today. For example: ASP.NET features will continue to be developed in `dotnet/aspnetcore` and CLR features will be continue to be developed in `dotnet/runtime`. Each of these repos have their own distinct communities and processes, and aggregating development into a true mono-repo would work against that. Hence, the "virtual" monolithic repo: the VMR gives us the simplicity of a mono-repo for building and servicing the product, while active development of components of that product stays in its various existing repos. The day to day experience for typical contributors will not change.
+
+## Supported platforms
+
+- 8.0 and 9.0
+ - source-build configuration on Linux
+- 10.0+ (WIP)
+ - source-build configuration on Linux
+ - non-source-build configuration on Linux, Mac, and Windows
+
+For the latest information about Source-Build support for new .NET versions, please check our [GitHub Discussions page](https://github.com/dotnet/source-build/discussions) for announcements.
+
+## Code flow
+
+The VMR's code flow operates in two directions. Individual repositories flow source changes into the VMR upon promotion of their local official builds (forward flow). The VMR changes are checked in, an official build happens, and then source changes + packages flows backward into the constituent repositories (back flow). For more details on code flow and code flow pull requests, please see this information on [Code Flow PRs](docs/Codeflow-PRs.md).
+
+## Contribution
+
+Contribution to the .NET product should currently be done mostly in the constituent repositories. The reasons for this are two-fold:
+- We want to slowly ramp up direct VMR changes to avoid surprises.
+- The individual repositories still have the best validation for most changes.
+
+If you would like to make a cross-cutting change in the VMR, please ask the Unified Build team (please tag @dotnet/product-construction in an issue/discussion in your repository). However, some changes **should** be made directly in the VMR. For a breakdown of where changes should be made, please see below.
+
+#### Where to make changes:
+
+- `src/*` - Constituent repositories, except VMR pipeline changes.
+- Non `src/*` directories - Directly in VMR
+- Arcade `eng/common` changes - There are many copies of eng/common in the VMR:
+ - The VMR uses its root eng/common/* to bootstrap the VMR build. These should not be updated manually. They should only be updated via a re-bootrap of the VMR.
+ - A VMR build uses `src/arcade/eng/common/*` for arcade and any repository that builds after arcade. Changes may be made to these files, and they will flow back into arcade as well as to any repository that gets its arcade flow from the VMR. However, due to varying scenarios in which `eng/common/` can be used, it is generally recommended that the VMR only be used to test `eng/common` changes, while actual changes should still be made in the dotnet/arcade repository.
+- VMR pipeline changes - The root pipeline logic lives in eng/* and should be changed in the VMR.
+
+For any questions, please ask the Unified Build team.
+
+## Dev instructions
+
+Please note that **this repository is a work-in-progress** and there are some usability issues connected to this.
+These can be nuisances such as some checked-in files getting modified by the build itself and similar.
+For the latest information about Source-Build support, please watch for announcements posted on our [GitHub Discussions page](https://github.com/dotnet/source-build/discussions).
+
+### Prerequisites
+
+The dependencies for building can be found [here](https://github.com/dotnet/runtime/blob/main/docs/workflow/requirements/).
+In case you don't want to / cannot prepare your environment per the requirements, consider [using Docker](#building-using-docker).
+
+For building the VMR with Source-Build, the following additional dependencies are required for your Linux environment:
+* `brotli-dev`
+
+For building the VMR on Windows, it is recommended to put the repo under a short path, i.e. `C:\dotnet`. Also, [long path support must be enabled](https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-version-1607-and-later). This is necessary as some of the tools used don't support long paths (WiX Toolset v3 and cl.exe).
+
+For some `git` commands and when synchronizing changes via the `darc` CLI, long path support should be enabled in the `git` config as well:
+```bash
+git config --system core.longpaths true # needs elevated prompt
+git config --global core.longpaths true
+```
+
+### Building
+
+1. **Clone the repository**
+
+ ```bash
+ git clone https://github.com/dotnet/dotnet dotnet-dotnet
+ cd dotnet-dotnet
+ ```
+
+1. **Build the .NET SDK**
+
+ Choose one of the following build modes:
+
+ - **Microsoft based build**
+
+ For Unix:
+
+ ```bash
+ ./build.sh --clean-while-building
+ ```
+
+ For Windows:
+
+ ```cmd
+ .\build.cmd -cleanWhileBuilding
+ ```
+
+ - **Building from source**
+
+ ```bash
+ # Prep the source to build on your distro.
+ # This downloads a .NET SDK and a number of .NET packages needed to build .NET from source.
+ ./prep-source-build.sh
+
+ # Build the .NET SDK
+ ./build.sh -sb --clean-while-building
+
+ # When building RTM and servicing, pass the `--branding` switch to generate stable branding
+ ./build.sh --sb --branding rtm
+ ```
+
+ The resulting SDK is placed at `artifacts/assets/Release/dotnet-sdk-9.0.100-[your-RID].tar.gz` (for Unix) or `artifacts/assets/Release/dotnet-sdk-9.0.100-[your-RID].zip` (for Windows).
+
+1. *(Optional)* **Unpack and install the .NET SDK**
+
+ For Unix:
+
+ ```bash
+ mkdir -p $HOME/dotnet
+ tar zxf artifacts/assets/Release/dotnet-sdk-10.0.100-[your-RID].tar.gz -C $HOME/dotnet
+ ln -s $HOME/dotnet/dotnet /usr/bin/dotnet
+ ```
+
+ For Windows:
+
+ ```cmd
+ mkdir %userprofile%\dotnet
+ tar -xf artifacts/assets/Release/dotnet-sdk-10.0.100-[your RID].zip -C %userprofile%\dotnet
+ set "PATH=%userprofile%\dotnet;%PATH%"
+ ```
+
+ To test your built SDK, run the following:
+
+ ```bash
+ dotnet --info
+ ```
+
+> [!NOTE]
+> Run `./build.sh --help` (for Unix) or `.\build.cmd -help` (for Windows) to see more information about supported build options.
+
+### Building using Docker
+
+You can also build the repository using a Docker image which has the required prerequisites inside.
+The example below creates a Docker volume named `vmr` and clones and builds the VMR there.
+
+```sh
+docker run --rm -it -v vmr:/vmr -w /vmr mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream-10-amd64
+git clone https://github.com/dotnet/dotnet .
+
+# - Microsoft based build
+./build.sh --clean-while-building
+
+# - Building from source
+./prep-source-build.sh && ./build.sh -sb --clean-while-building
+
+mkdir -p $HOME/.dotnet
+tar -zxf artifacts/assets/Release/dotnet-sdk-9.0.100-centos.9-x64.tar.gz -C $HOME/.dotnet
+ln -s $HOME/.dotnet/dotnet /usr/bin/dotnet
+```
+
+### Codespaces
+
+You can also utilize [GitHub Codespaces](https://github.com/features/codespaces) where you can find preset containers in this repository.
+
+### Building from released sources
+
+You can also build from sources (and not from a context of a git repository), such as the ones you can acquire from a [dotnet/dotnet release](https://github.com/dotnet/dotnet/releases).
+In this case, you need to provide additional information which includes the original repository and commit hash the code was built from so that the SDK can provide a better debugging experience (think the `Step into..` functionality).
+Usually, this means the [dotnet/dotnet repository](https://github.com/dotnet/dotnet) together with the commit the release tag is connected to.
+
+In practice, this means that when calling the main build script, you need to provide additional arguments when building outside of a context of a git repository.
+Alternatively, you can also provide a manifest file where this information can be read from. This file (`release.json`) can be found attached with the [dotnet/dotnet release](https://github.com/dotnet/dotnet/releases).
+
+### Synchronizing code into the VMR
+
+Sometimes you want to make a change in a repository and test that change in the VMR. You could of course make the change in the VMR directly, but in case it's already available in your repository, you can synchronize it locally into your clone of the VMR, commit, and then open a PR.
+
+To do this, you need to use the [`darc vmr forwardflow` command](https://github.com/dotnet/arcade-services/blob/main/docs/Darc.md#forwardflow) which can move your changes from your repository's dev branch into a local VMR one. Please refer to command's documentation (`--help`) for more details.
+
+## Filing Issues
+
+This repo should contain issues that are tied to the VMR infrastructure and documentation.
+
+For other issues, please open them in the appropriate product repos. We have links to many of them on [our new issue page](https://github.com/dotnet/dotnet/issues/new/choose).
+
+## Useful Links
+
+- Design documentation for the VMR - a set of documents describing the high-level design and the why's and how's
+ - [Design and Operation](docs/VMR-Design-And-Operation.md)
+ - [Upstream/Downstream Relationships](docs/VMR-Upstream-Downstream.md)
+ - [Code and Build Workflow](docs/VMR-Code-And-Build-Workflow.md)
+ - [Strategy for Managing External Source Dependencies](docs/VMR-Strategy-For-External-Source.md)
+- [.NET Source-Build](https://github.com/dotnet/source-build)
+- [What is .NET](https://dotnet.microsoft.com)
+
+## .NET Foundation
+
+.NET Runtime is a [.NET Foundation](https://www.dotnetfoundation.org/projects) project.
+
+## License
+
+.NET is licensed under the [MIT](LICENSE.TXT) license.
diff --git a/v2/rscg_examples/XmlCommentGenerator/src/TestProgram.slnx b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram.slnx
new file mode 100644
index 000000000..c35e4f372
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram.slnx
@@ -0,0 +1,3 @@
+
+
+
diff --git a/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/Program.cs b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/Program.cs
new file mode 100644
index 000000000..ffd9d869a
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/Program.cs
@@ -0,0 +1,48 @@
+using System.Text.Json.Serialization;
+using Microsoft.AspNetCore.Http.HttpResults;
+
+var builder = WebApplication.CreateSlimBuilder(args);
+
+builder.Services.ConfigureHttpJsonOptions(options =>
+{
+ options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
+});
+
+// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
+builder.Services.AddOpenApi();
+
+var app = builder.Build();
+
+if (app.Environment.IsDevelopment())
+{
+ app.MapOpenApi();
+}
+
+Todo[] sampleTodos =
+[
+ new(1, "Walk the dog"),
+ new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
+ new(3, "Do the laundry", DateOnly.FromDateTime(DateTime.Now.AddDays(1))),
+ new(4, "Clean the bathroom"),
+ new(5, "Clean the car", DateOnly.FromDateTime(DateTime.Now.AddDays(2)))
+];
+
+var todosApi = app.MapGroup("/todos");
+todosApi.MapGet("/", () => sampleTodos)
+ .WithName("GetTodos");
+
+todosApi.MapGet("/{id}", Results, NotFound> (int id) =>
+ sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
+ ? TypedResults.Ok(todo)
+ : TypedResults.NotFound())
+ .WithName("GetTodoById");
+
+app.Run();
+
+public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false);
+
+[JsonSerializable(typeof(Todo[]))]
+internal partial class AppJsonSerializerContext : JsonSerializerContext
+{
+
+}
diff --git a/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/Properties/launchSettings.json b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/Properties/launchSettings.json
new file mode 100644
index 000000000..dbf050caa
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/Properties/launchSettings.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "todos",
+ "applicationUrl": "http://localhost:5219",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/TestProgram.csproj b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/TestProgram.csproj
new file mode 100644
index 000000000..560a8c045
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/TestProgram.csproj
@@ -0,0 +1,18 @@
+
+
+
+ net10.0
+ enable
+ enable
+ true
+ true
+
+
+
+
+
+
+ true
+ $(BaseIntermediateOutputPath)\GX
+
+
diff --git a/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/TestProgram.http b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/TestProgram.http
new file mode 100644
index 000000000..743112829
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/TestProgram.http
@@ -0,0 +1,11 @@
+@TestProgram_HostAddress = http://localhost:5219
+
+GET {{TestProgram_HostAddress}}/todos/
+Accept: application/json
+
+###
+
+GET {{TestProgram_HostAddress}}/todos/1
+Accept: application/json
+
+###
diff --git a/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/appsettings.Development.json b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/appsettings.Development.json
new file mode 100644
index 000000000..0c208ae91
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/appsettings.json b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/appsettings.json
new file mode 100644
index 000000000..10f68b8c8
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/src/TestProgram/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/v2/rscg_examples/XmlCommentGenerator/video.json b/v2/rscg_examples/XmlCommentGenerator/video.json
new file mode 100644
index 000000000..867e6a984
--- /dev/null
+++ b/v2/rscg_examples/XmlCommentGenerator/video.json
@@ -0,0 +1,39 @@
+{
+ "scriptName": "XmlCommentGenerator",
+ "steps":
+[
+ {"typeStep":"exec","arg":"clipchamp.exe launch"},
+ {"typeStep":"text","arg": "Welcome to Roslyn Examples"},
+ {"typeStep":"text","arg":"If you want to see more examples , see List Of RSCG"},
+ {"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/List-of-RSCG"},
+ {"typeStep":"text","arg": "My name is Andrei Ignat and I am deeply fond of Roslyn Source Code Generator. "},
+
+{"typeStep":"text","arg": "Today I will present Microsoft.AspNetCore.OpenApi . Adding Xml comments to generated OpenAPI documentation ."},
+{"typeStep":"browser","arg":"https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/"},
+{"typeStep":"text","arg": "The whole example is here"},
+{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator"},
+{"typeStep":"text","arg": "You can download the code from here"},
+{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator#download-example-net--c-"},
+{"typeStep":"text","arg":"Here is the code downloaded "},
+{"typeStep":"exec","arg":"explorer.exe /select,D:\\gth\\RSCG_Examples\\v2\\Generator.sln"},
+{"typeStep":"text","arg": "So , let's start the project with Visual Studio Code "},
+{"typeStep":"stepvscode","arg": "-n D:\\gth\\RSCG_Examples\\v2"},
+
+{"typeStep":"text","arg": "To use it ,you will put the Nuget Microsoft.AspNetCore.OpenApi into the csproj "},
+
+{"typeStep":"stepvscode","arg": "-r -g D:\\gth\\RSCG_Examples\\v2\\rscg_examples\\XmlCommentGenerator\\src\\TestProgram\\TestProgram.csproj"},
+
+{"typeStep":"text","arg": "And now I will show you an example of using Microsoft.AspNetCore.OpenApi"},
+
+{"typeStep":"hide","arg": "now execute the tour in VSCode"},
+{"typeStep":"tour", "arg": "src/.tours/"},
+{"typeStep":"text","arg":" And I will execute the project"},
+{"typeStep":"showproj", "arg":"TestProgram.csproj"},
+{"typeStep":"text","arg":" This concludes the project"},
+{"typeStep":"waitseconds","arg":"30"},
+{"typeStep":"text","arg": "Remember, you can download the code from here"},
+{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator#download-example-net--c-",
+SpeakTest=" "},
+{"typeStep":"waitseconds","arg":"30"},
+]
+}
diff --git a/v2/rscg_examples_site/docs/Categories/API.md b/v2/rscg_examples_site/docs/Categories/API.md
index 61bb83412..7401e734b 100644
--- a/v2/rscg_examples_site/docs/Categories/API.md
+++ b/v2/rscg_examples_site/docs/Categories/API.md
@@ -1,6 +1,6 @@
API
-Number RSCG: 10
+Number RSCG: 11
1 [immediate.apis](/docs/immediate.apis) [](https://www.nuget.org/packages/immediate.apis/)  2025-03-27
@@ -21,4 +21,6 @@ Number RSCG: 10
9 [SafeRouting](/docs/SafeRouting) [](https://www.nuget.org/packages/SafeRouting/)  2023-09-23
10 [SkinnyControllersCommon](/docs/SkinnyControllersCommon) [](https://www.nuget.org/packages/SkinnyControllersCommon)  2023-04-16
+
+ 11 [XmlCommentGenerator](/docs/XmlCommentGenerator) [](https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/)  2025-11-09
\ No newline at end of file
diff --git a/v2/rscg_examples_site/docs/Categories/_PrimitiveAPI.mdx b/v2/rscg_examples_site/docs/Categories/_PrimitiveAPI.mdx
index b33ec4e41..783bcf43d 100644
--- a/v2/rscg_examples_site/docs/Categories/_PrimitiveAPI.mdx
+++ b/v2/rscg_examples_site/docs/Categories/_PrimitiveAPI.mdx
@@ -20,6 +20,8 @@
10 [SkinnyControllersCommon](/docs/SkinnyControllersCommon) [](https://www.nuget.org/packages/SkinnyControllersCommon)  2023-04-16
+ 11 [XmlCommentGenerator](/docs/XmlCommentGenerator) [](https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/)  2025-11-09
+
### See category
[API](/docs/Categories/API)
diff --git a/v2/rscg_examples_site/docs/RSCG-Examples/XmlCommentGenerator.md b/v2/rscg_examples_site/docs/RSCG-Examples/XmlCommentGenerator.md
new file mode 100644
index 000000000..5041bd744
--- /dev/null
+++ b/v2/rscg_examples_site/docs/RSCG-Examples/XmlCommentGenerator.md
@@ -0,0 +1,1029 @@
+---
+sidebar_position: 2400
+title: 240 - XmlCommentGenerator
+description: Adding Xml comments to generated OpenAPI documentation
+slug: /XmlCommentGenerator
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import TOCInline from '@theme/TOCInline';
+import SameCategory from '../Categories/_PrimitiveAPI.mdx';
+
+# XmlCommentGenerator by Microsoft
+
+
+
+
+## NuGet / site data
+[](https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/)
+[](https://github.com/dotnet/dotnet/)
+
+
+## Details
+
+### Info
+:::info
+
+Name: **XmlCommentGenerator**
+
+Provides APIs for annotating route handler endpoints in ASP.NET Core with OpenAPI annotations.
+
+This package was built from the source code at https://github.com/dotnet/aspnetcore/tree/e77cb01b5529c137130757859f09f892dbdd2436
+
+Author: Microsoft
+
+NuGet:
+*https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/*
+
+
+You can find more details at https://dotnet.microsoft.com/en-us/apps/aspnet
+
+Source: https://github.com/dotnet/dotnet/
+
+:::
+
+### Author
+:::note
+Microsoft
+
+:::
+
+### Original Readme
+:::note
+
+# dotnet/dotnet - Home of the .NET VMR
+
+This repository is a **Virtual Monolithic Repository (VMR)** which includes all the source code and infrastructure needed to build the .NET SDK.
+
+What this means:
+
+- **Monolithic** - a join of multiple repositories that make up the whole product, such as [dotnet/runtime](https://github.com/dotnet/runtime) or [dotnet/sdk](https://github.com/dotnet/sdk).
+- **Virtual** - a mirror (not replacement) of product repos where sources from those repositories are synchronized with.
+
+In the VMR, you can find:
+
+- source files of each product repository which are mirrored inside of their respective directories under [`src/`](https://github.com/dotnet/dotnet/tree/main/src),
+- tooling that enables [building the whole .NET product from source](https://github.com/dotnet/source-build) on Linux platforms,
+- *[in future]* E2E tests for the whole .NET product.
+
+Just like the development repositories, the VMR will have a release branch for every feature band (e.g. `release/10.0.1xx`).
+Similarly, VMR's `main` branch will follow default branches of product repositories (see [Synchronization Based on Declared Dependencies](https://github.com/dotnet/dotnet//docs/VMR-Design-And-Operation.md#synchronization-based-on-declared-dependencies)).
+
+More in-depth documentation about the VMR can be found in [VMR Design And Operation](https://github.com/dotnet/dotnet//docs/VMR-Design-And-Operation.md#layout).
+See also [dotnet/source-build](https://github.com/dotnet/source-build) for more information about our whole-product source-build.
+
+## Installing the SDK
+
+You can download the .NET SDK either as an installer (MSI, PKG) or as an archive (zip, tar.gz). The .NET SDK contains both the .NET runtimes and CLI tools.
+
+- [**Latest builds table**](https://github.com/dotnet/dotnet//docs/builds-table.md)
+
+## Goals
+
+- The main purpose of the [dotnet/dotnet](https://github.com/dotnet/dotnet) repository is to have all source code necessary to build the .NET product available in one repository and identified by a single commit.
+- The VMR also aims to become the place from which we release and service future versions of .NET to reduce the complexity of the product construction process. This should allow our partners and and 3rd parties to easily build, test and modify .NET using their custom infrastructure as well as make the process available to the community.
+- Lastly, we hope to solve other problems that the current multi-repo setup brings:
+ - Enable the standard [down-/up-stream open-source model](https://github.com/dotnet/dotnet//docs/VMR-Upstream-Downstream.md).
+ - Fulfill requirements of .NET distro builders such as RedHat or Canonical to natively include .NET in their distribution repositories.
+ - Simplify scenarios such as client-run testing of bug fixes and improvements. The build should work in an offline environment too for certain platforms.
+ - Enable developers to make and test changes spanning multiple repositories.
+ - More efficient pipeline for security fixes during the CVE pre-disclosure process.
+
+We will achieve these goals while keeping active coding work in the separate repos where it happens today. For example: ASP.NET features will continue to be developed in `dotnet/aspnetcore` and CLR features will be continue to be developed in `dotnet/runtime`. Each of these repos have their own distinct communities and processes, and aggregating development into a true mono-repo would work against that. Hence, the "virtual" monolithic repo: the VMR gives us the simplicity of a mono-repo for building and servicing the product, while active development of components of that product stays in its various existing repos. The day to day experience for typical contributors will not change.
+
+## Supported platforms
+
+- 8.0 and 9.0
+ - source-build configuration on Linux
+- 10.0+ (WIP)
+ - source-build configuration on Linux
+ - non-source-build configuration on Linux, Mac, and Windows
+
+For the latest information about Source-Build support for new .NET versions, please check our [GitHub Discussions page](https://github.com/dotnet/source-build/discussions) for announcements.
+
+## Code flow
+
+The VMR's code flow operates in two directions. Individual repositories flow source changes into the VMR upon promotion of their local official builds (forward flow). The VMR changes are checked in, an official build happens, and then source changes + packages flows backward into the constituent repositories (back flow). For more details on code flow and code flow pull requests, please see this information on [Code Flow PRs](https://github.com/dotnet/dotnet//docs/Codeflow-PRs.md).
+
+## Contribution
+
+Contribution to the .NET product should currently be done mostly in the constituent repositories. The reasons for this are two-fold:
+- We want to slowly ramp up direct VMR changes to avoid surprises.
+- The individual repositories still have the best validation for most changes.
+
+If you would like to make a cross-cutting change in the VMR, please ask the Unified Build team (please tag @dotnet/product-construction in an issue/discussion in your repository). However, some changes **should** be made directly in the VMR. For a breakdown of where changes should be made, please see below.
+
+#### Where to make changes:
+
+- `src/*` - Constituent repositories, except VMR pipeline changes.
+- Non `src/*` directories - Directly in VMR
+- Arcade `eng/common` changes - There are many copies of eng/common in the VMR:
+ - The VMR uses its root eng/common/* to bootstrap the VMR build. These should not be updated manually. They should only be updated via a re-bootrap of the VMR.
+ - A VMR build uses `src/arcade/eng/common/*` for arcade and any repository that builds after arcade. Changes may be made to these files, and they will flow back into arcade as well as to any repository that gets its arcade flow from the VMR. However, due to varying scenarios in which `eng/common/` can be used, it is generally recommended that the VMR only be used to test `eng/common` changes, while actual changes should still be made in the dotnet/arcade repository.
+- VMR pipeline changes - The root pipeline logic lives in eng/* and should be changed in the VMR.
+
+For any questions, please ask the Unified Build team.
+
+## Dev instructions
+
+Please note that **this repository is a work-in-progress** and there are some usability issues connected to this.
+These can be nuisances such as some checked-in files getting modified by the build itself and similar.
+For the latest information about Source-Build support, please watch for announcements posted on our [GitHub Discussions page](https://github.com/dotnet/source-build/discussions).
+
+### Prerequisites
+
+The dependencies for building can be found [here](https://github.com/dotnet/runtime/blob/main/docs/workflow/requirements/).
+In case you don't want to / cannot prepare your environment per the requirements, consider [using Docker](#building-using-docker).
+
+For building the VMR with Source-Build, the following additional dependencies are required for your Linux environment:
+* `brotli-dev`
+
+For building the VMR on Windows, it is recommended to put the repo under a short path, i.e. `C:\dotnet`. Also, [long path support must be enabled](https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-version-1607-and-later). This is necessary as some of the tools used don't support long paths (WiX Toolset v3 and cl.exe).
+
+For some `git` commands and when synchronizing changes via the `darc` CLI, long path support should be enabled in the `git` config as well:
+```bash
+git config --system core.longpaths true # needs elevated prompt
+git config --global core.longpaths true
+```
+
+### Building
+
+1. **Clone the repository**
+
+ ```bash
+ git clone https://github.com/dotnet/dotnet dotnet-dotnet
+ cd dotnet-dotnet
+ ```
+
+1. **Build the .NET SDK**
+
+ Choose one of the following build modes:
+
+ - **Microsoft based build**
+
+ For Unix:
+
+ ```bash
+ ./build.sh --clean-while-building
+ ```
+
+ For Windows:
+
+ ```cmd
+ .\build.cmd -cleanWhileBuilding
+ ```
+
+ - **Building from source**
+
+ ```bash
+ # Prep the source to build on your distro.
+ # This downloads a .NET SDK and a number of .NET packages needed to build .NET from source.
+ ./prep-source-build.sh
+
+ # Build the .NET SDK
+ ./build.sh -sb --clean-while-building
+
+ # When building RTM and servicing, pass the `--branding` switch to generate stable branding
+ ./build.sh --sb --branding rtm
+ ```
+
+ The resulting SDK is placed at `artifacts/assets/Release/dotnet-sdk-9.0.100-[your-RID].tar.gz` (for Unix) or `artifacts/assets/Release/dotnet-sdk-9.0.100-[your-RID].zip` (for Windows).
+
+1. *(Optional)* **Unpack and install the .NET SDK**
+
+ For Unix:
+
+ ```bash
+ mkdir -p $HOME/dotnet
+ tar zxf artifacts/assets/Release/dotnet-sdk-10.0.100-[your-RID].tar.gz -C $HOME/dotnet
+ ln -s $HOME/dotnet/dotnet /usr/bin/dotnet
+ ```
+
+ For Windows:
+
+ ```cmd
+ mkdir %userprofile%\dotnet
+ tar -xf artifacts/assets/Release/dotnet-sdk-10.0.100-[your RID].zip -C %userprofile%\dotnet
+ set "PATH=%userprofile%\dotnet;%PATH%"
+ ```
+
+ To test your built SDK, run the following:
+
+ ```bash
+ dotnet --info
+ ```
+
+> [!NOTE]
+> Run `./build.sh --help` (for Unix) or `.\build.cmd -help` (for Windows) to see more information about supported build options.
+
+### Building using Docker
+
+You can also build the repository using a Docker image which has the required prerequisites inside.
+The example below creates a Docker volume named `vmr` and clones and builds the VMR there.
+
+```sh
+docker run --rm -it -v vmr:/vmr -w /vmr mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream-10-amd64
+git clone https://github.com/dotnet/dotnet .
+
+# - Microsoft based build
+./build.sh --clean-while-building
+
+# - Building from source
+./prep-source-build.sh && ./build.sh -sb --clean-while-building
+
+mkdir -p $HOME/.dotnet
+tar -zxf artifacts/assets/Release/dotnet-sdk-9.0.100-centos.9-x64.tar.gz -C $HOME/.dotnet
+ln -s $HOME/.dotnet/dotnet /usr/bin/dotnet
+```
+
+### Codespaces
+
+You can also utilize [GitHub Codespaces](https://github.com/features/codespaces) where you can find preset containers in this repository.
+
+### Building from released sources
+
+You can also build from sources (and not from a context of a git repository), such as the ones you can acquire from a [dotnet/dotnet release](https://github.com/dotnet/dotnet/releases).
+In this case, you need to provide additional information which includes the original repository and commit hash the code was built from so that the SDK can provide a better debugging experience (think the `Step into..` functionality).
+Usually, this means the [dotnet/dotnet repository](https://github.com/dotnet/dotnet) together with the commit the release tag is connected to.
+
+In practice, this means that when calling the main build script, you need to provide additional arguments when building outside of a context of a git repository.
+Alternatively, you can also provide a manifest file where this information can be read from. This file (`release.json`) can be found attached with the [dotnet/dotnet release](https://github.com/dotnet/dotnet/releases).
+
+### Synchronizing code into the VMR
+
+Sometimes you want to make a change in a repository and test that change in the VMR. You could of course make the change in the VMR directly, but in case it's already available in your repository, you can synchronize it locally into your clone of the VMR, commit, and then open a PR.
+
+To do this, you need to use the [`darc vmr forwardflow` command](https://github.com/dotnet/arcade-services/blob/main/docs/Darc.md#forwardflow) which can move your changes from your repository's dev branch into a local VMR one. Please refer to command's documentation (`--help`) for more details.
+
+## Filing Issues
+
+This repo should contain issues that are tied to the VMR infrastructure and documentation.
+
+For other issues, please open them in the appropriate product repos. We have links to many of them on [our new issue page](https://github.com/dotnet/dotnet/issues/new/choose).
+
+## Useful Links
+
+- Design documentation for the VMR - a set of documents describing the high-level design and the why's and how's
+ - [Design and Operation](https://github.com/dotnet/dotnet//docs/VMR-Design-And-Operation.md)
+ - [Upstream/Downstream Relationships](https://github.com/dotnet/dotnet//docs/VMR-Upstream-Downstream.md)
+ - [Code and Build Workflow](https://github.com/dotnet/dotnet//docs/VMR-Code-And-Build-Workflow.md)
+ - [Strategy for Managing External Source Dependencies](https://github.com/dotnet/dotnet//docs/VMR-Strategy-For-External-Source.md)
+- [.NET Source-Build](https://github.com/dotnet/source-build)
+- [What is .NET](https://dotnet.microsoft.com)
+
+## .NET Foundation
+
+.NET Runtime is a [.NET Foundation](https://www.dotnetfoundation.org/projects) project.
+
+## License
+
+.NET is licensed under the [MIT](https://github.com/dotnet/dotnet//LICENSE.TXT) license.
+
+
+:::
+
+### About
+:::note
+
+Adding Xml comments to generated OpenAPI documentation
+
+
+:::
+
+## How to use
+
+### Example (source csproj, source files)
+
+
+
+
+
+This is the CSharp Project that references **XmlCommentGenerator**
+```xml showLineNumbers {12}
+
+
+
+ net10.0
+ enable
+ enable
+ true
+ true
+
+
+
+
+
+
+ true
+ $(BaseIntermediateOutputPath)\GX
+
+
+
+```
+
+
+
+
+
+ This is the use of **XmlCommentGenerator** in *Program.cs*
+
+```csharp showLineNumbers
+using System.Text.Json.Serialization;
+using Microsoft.AspNetCore.Http.HttpResults;
+
+var builder = WebApplication.CreateSlimBuilder(args);
+
+builder.Services.ConfigureHttpJsonOptions(options =>
+{
+ options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
+});
+
+// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
+builder.Services.AddOpenApi();
+
+var app = builder.Build();
+
+if (app.Environment.IsDevelopment())
+{
+ app.MapOpenApi();
+}
+
+Todo[] sampleTodos =
+[
+ new(1, "Walk the dog"),
+ new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
+ new(3, "Do the laundry", DateOnly.FromDateTime(DateTime.Now.AddDays(1))),
+ new(4, "Clean the bathroom"),
+ new(5, "Clean the car", DateOnly.FromDateTime(DateTime.Now.AddDays(2)))
+];
+
+var todosApi = app.MapGroup("/todos");
+todosApi.MapGet("/", () => sampleTodos)
+ .WithName("GetTodos");
+
+todosApi.MapGet("/{id}", Results, NotFound> (int id) =>
+ sampleTodos.FirstOrDefault(a => a.Id == id) is \{ \} todo
+ ? TypedResults.Ok(todo)
+ : TypedResults.NotFound())
+ .WithName("GetTodoById");
+
+app.Run();
+
+public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false);
+
+[JsonSerializable(typeof(Todo[]))]
+internal partial class AppJsonSerializerContext : JsonSerializerContext
+{
+
+}
+
+```
+
+
+
+
+### Generated Files
+
+Those are taken from $(BaseIntermediateOutputPath)\GX
+
+
+
+
+```csharp showLineNumbers
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+#nullable enable
+// Suppress warnings about obsolete types and members
+// in generated code
+#pragma warning disable CS0612, CS0618
+
+namespace System.Runtime.CompilerServices
+{
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+ file sealed class InterceptsLocationAttribute : System.Attribute
+ {
+ public InterceptsLocationAttribute(int version, string data)
+ {
+ }
+ }
+}
+
+namespace Microsoft.AspNetCore.OpenApi.Generated
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Diagnostics.CodeAnalysis;
+ using System.Globalization;
+ using System.Linq;
+ using System.Reflection;
+ using System.Text;
+ using System.Text.Json;
+ using System.Text.Json.Nodes;
+ using System.Threading;
+ using System.Threading.Tasks;
+ using Microsoft.AspNetCore.OpenApi;
+ using Microsoft.AspNetCore.Mvc.Controllers;
+ using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
+ using Microsoft.Extensions.DependencyInjection;
+ using Microsoft.OpenApi;
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file record XmlComment(
+ string? Summary,
+ string? Description,
+ string? Remarks,
+ string? Returns,
+ string? Value,
+ bool Deprecated,
+ List? Examples,
+ List? Parameters,
+ List? Responses);
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file record XmlParameterComment(string? Name, string? Description, string? Example, bool Deprecated);
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file record XmlResponseComment(string Code, string? Description, string? Example);
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file static class XmlCommentCache
+ {
+ private static Dictionary? _cache;
+ public static Dictionary Cache => _cache ??= GenerateCacheEntries();
+
+ private static Dictionary GenerateCacheEntries()
+ {
+ var cache = new Dictionary();
+
+
+ return cache;
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file static class DocumentationCommentIdHelper
+ {
+ ///
+ /// Generates a documentation comment ID for a type.
+ /// Example: T:Namespace.Outer+Inner`1 becomes T:Namespace.Outer.Inner`1
+ ///
+ public static string CreateDocumentationId(this Type type)
+ {
+ if (type == null)
+ {
+ throw new ArgumentNullException(nameof(type));
+ }
+
+ return "T:" + GetTypeDocId(type, includeGenericArguments: false, omitGenericArity: false);
+ }
+
+ ///
+ /// Generates a documentation comment ID for a property.
+ /// Example: P:Namespace.ContainingType.PropertyName or for an indexer P:Namespace.ContainingType.Item(System.Int32)
+ ///
+ public static string CreateDocumentationId(this PropertyInfo property)
+ {
+ if (property == null)
+ {
+ throw new ArgumentNullException(nameof(property));
+ }
+
+ var sb = new StringBuilder();
+ sb.Append("P:");
+
+ if (property.DeclaringType != null)
+ {
+ sb.Append(GetTypeDocId(property.DeclaringType, includeGenericArguments: false, omitGenericArity: false));
+ }
+
+ sb.Append('.');
+ sb.Append(property.Name);
+
+ // For indexers, include the parameter list.
+ var indexParams = property.GetIndexParameters();
+ if (indexParams.Length > 0)
+ {
+ sb.Append('(');
+ for (int i = 0; i < indexParams.Length; i++)
+ {
+ if (i > 0)
+ {
+ sb.Append(',');
+ }
+
+ sb.Append(GetTypeDocId(indexParams[i].ParameterType, includeGenericArguments: true, omitGenericArity: false));
+ }
+ sb.Append(')');
+ }
+
+ return sb.ToString();
+ }
+
+ ///
+ /// Generates a documentation comment ID for a property given its container type and property name.
+ /// Example: P:Namespace.ContainingType.PropertyName
+ ///
+ public static string CreateDocumentationId(Type containerType, string propertyName)
+ {
+ if (containerType == null)
+ {
+ throw new ArgumentNullException(nameof(containerType));
+ }
+ if (string.IsNullOrEmpty(propertyName))
+ {
+ throw new ArgumentException("Property name cannot be null or empty.", nameof(propertyName));
+ }
+
+ var sb = new StringBuilder();
+ sb.Append("P:");
+ sb.Append(GetTypeDocId(containerType, includeGenericArguments: false, omitGenericArity: false));
+ sb.Append('.');
+ sb.Append(propertyName);
+
+ return sb.ToString();
+ }
+
+ ///
+ /// Generates a documentation comment ID for a method (or constructor).
+ /// For example:
+ /// M:Namespace.ContainingType.MethodName(ParamType1,ParamType2)~ReturnType
+ /// M:Namespace.ContainingType.#ctor(ParamType)
+ ///
+ public static string CreateDocumentationId(this MethodInfo method)
+ {
+ if (method == null)
+ {
+ throw new ArgumentNullException(nameof(method));
+ }
+
+ var sb = new StringBuilder();
+ sb.Append("M:");
+
+ // Append the fully qualified name of the declaring type.
+ if (method.DeclaringType != null)
+ {
+ sb.Append(GetTypeDocId(method.DeclaringType, includeGenericArguments: false, omitGenericArity: false));
+ }
+
+ sb.Append('.');
+
+ // Append the method name, handling constructors specially.
+ if (method.IsConstructor)
+ {
+ sb.Append(method.IsStatic ? "#cctor" : "#ctor");
+ }
+ else
+ {
+ sb.Append(method.Name);
+ if (method.IsGenericMethod)
+ {
+ sb.Append("``");
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0}", method.GetGenericArguments().Length);
+ }
+ }
+
+ // Append the parameter list, if any.
+ var parameters = method.GetParameters();
+ if (parameters.Length > 0)
+ {
+ sb.Append('(');
+ for (int i = 0; i < parameters.Length; i++)
+ {
+ if (i > 0)
+ {
+ sb.Append(',');
+ }
+
+ // Omit the generic arity for the parameter type.
+ sb.Append(GetTypeDocId(parameters[i].ParameterType, includeGenericArguments: true, omitGenericArity: true));
+ }
+ sb.Append(')');
+ }
+
+ // Append the return type after a '~' (if the method returns a value).
+ if (method.ReturnType != typeof(void))
+ {
+ sb.Append('~');
+ // Omit the generic arity for the return type.
+ sb.Append(GetTypeDocId(method.ReturnType, includeGenericArguments: true, omitGenericArity: true));
+ }
+
+ return sb.ToString();
+ }
+
+ ///
+ /// Generates a documentation ID string for a type.
+ /// This method handles nested types (replacing '+' with '.'),
+ /// generic types, arrays, pointers, by-ref types, and generic parameters.
+ /// The flag controls whether
+ /// constructed generic type arguments are emitted, while
+ /// controls whether the generic arity marker (e.g. "`1") is appended.
+ ///
+ private static string GetTypeDocId(Type type, bool includeGenericArguments, bool omitGenericArity)
+ {
+ if (type.IsGenericParameter)
+ {
+ // Use `` for method-level generic parameters and ` for type-level.
+ if (type.DeclaringMethod != null)
+ {
+ return "``" + type.GenericParameterPosition;
+ }
+ else if (type.DeclaringType != null)
+ {
+ return "`" + type.GenericParameterPosition;
+ }
+ else
+ {
+ return type.Name;
+ }
+ }
+
+ if (type.IsGenericType)
+ {
+ Type genericDef = type.GetGenericTypeDefinition();
+ string fullName = genericDef.FullName ?? genericDef.Name;
+
+ var sb = new StringBuilder(fullName.Length);
+
+ // Replace '+' with '.' for nested types
+ for (var i = 0; i < fullName.Length; i++)
+ {
+ char c = fullName[i];
+ if (c == '+')
+ {
+ sb.Append('.');
+ }
+ else if (c == '`')
+ {
+ break;
+ }
+ else
+ {
+ sb.Append(c);
+ }
+ }
+
+ if (!omitGenericArity)
+ {
+ int arity = genericDef.GetGenericArguments().Length;
+ sb.Append('`');
+ sb.AppendFormat(CultureInfo.InvariantCulture, "{0}", arity);
+ }
+
+ if (includeGenericArguments && !type.IsGenericTypeDefinition)
+ {
+ var typeArgs = type.GetGenericArguments();
+ sb.Append('{');
+
+ for (int i = 0; i < typeArgs.Length; i++)
+ {
+ if (i > 0)
+ {
+ sb.Append(',');
+ }
+
+ sb.Append(GetTypeDocId(typeArgs[i], includeGenericArguments, omitGenericArity));
+ }
+
+ sb.Append('}');
+ }
+
+ return sb.ToString();
+ }
+
+ // For non-generic types, use FullName (if available) and replace nested type separators.
+ return (type.FullName ?? type.Name).Replace('+', '.');
+ }
+
+ ///
+ /// Normalizes a documentation comment ID to match the compiler-style format.
+ /// Strips the return type suffix for ordinary methods but retains it for conversion operators.
+ ///
+ /// The documentation comment ID to normalize.
+ /// The normalized documentation comment ID.
+ public static string NormalizeDocId(string docId)
+ {
+ // Find the tilde character that indicates the return type suffix
+ var tildeIndex = docId.IndexOf('~');
+ if (tildeIndex == -1)
+ {
+ // No return type suffix, return as-is
+ return docId;
+ }
+
+ // Check if this is a conversion operator (op_Implicit or op_Explicit)
+ // For these operators, we need to keep the return type suffix
+ if (docId.Contains("op_Implicit") || docId.Contains("op_Explicit"))
+ {
+ return docId;
+ }
+
+ // For ordinary methods, strip the return type suffix
+ return docId.Substring(0, tildeIndex);
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file class XmlCommentOperationTransformer : IOpenApiOperationTransformer
+ {
+ public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransformerContext context, CancellationToken cancellationToken)
+ {
+ var methodInfo = context.Description.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor
+ ? controllerActionDescriptor.MethodInfo
+ : context.Description.ActionDescriptor.EndpointMetadata.OfType().SingleOrDefault();
+
+ if (methodInfo is null)
+ {
+ return Task.CompletedTask;
+ }
+ if (XmlCommentCache.Cache.TryGetValue(DocumentationCommentIdHelper.NormalizeDocId(methodInfo.CreateDocumentationId()), out var methodComment))
+ {
+ if (methodComment.Summary is \{ \} summary)
+ {
+ operation.Summary = summary;
+ }
+ if (methodComment.Description is \{ \} description)
+ {
+ operation.Description = description;
+ }
+ if (methodComment.Remarks is \{ \} remarks)
+ {
+ operation.Description = remarks;
+ }
+ if (methodComment.Parameters is \{ Count: > 0})
+ {
+ foreach (var parameterComment in methodComment.Parameters)
+ {
+ var parameterInfo = methodInfo.GetParameters().SingleOrDefault(info => info.Name == parameterComment.Name);
+ var operationParameter = operation.Parameters?.SingleOrDefault(parameter => parameter.Name == parameterComment.Name);
+ if (operationParameter is not null)
+ {
+ var targetOperationParameter = UnwrapOpenApiParameter(operationParameter);
+ targetOperationParameter.Description = parameterComment.Description;
+ if (parameterComment.Example is \{ \} jsonString)
+ {
+ targetOperationParameter.Example = jsonString.Parse();
+ }
+ targetOperationParameter.Deprecated = parameterComment.Deprecated;
+ }
+ else
+ {
+ var requestBody = operation.RequestBody;
+ if (requestBody is not null)
+ {
+ requestBody.Description = parameterComment.Description;
+ if (parameterComment.Example is \{ \} jsonString)
+ {
+ var content = requestBody?.Content?.Values;
+ if (content is null)
+ {
+ continue;
+ }
+ foreach (var mediaType in content)
+ {
+ mediaType.Example = jsonString.Parse();
+ }
+ }
+ }
+ }
+ }
+ }
+ // Applies `` on XML comments for operation with single response value.
+ if (methodComment.Returns is \{ \} returns && operation.Responses is \{ Count: 1 })
+ {
+ var response = operation.Responses.First();
+ response.Value.Description = returns;
+ }
+ // Applies `` on XML comments for operation with multiple response values.
+ if (methodComment.Responses is \{ Count: > 0} && operation.Responses is \{ Count: > 0 })
+ {
+ foreach (var response in operation.Responses)
+ {
+ var responseComment = methodComment.Responses.SingleOrDefault(xmlResponse => xmlResponse.Code == response.Key);
+ if (responseComment is not null)
+ {
+ response.Value.Description = responseComment.Description;
+ }
+ }
+ }
+ }
+ foreach (var parameterDescription in context.Description.ParameterDescriptions)
+ {
+ var metadata = parameterDescription.ModelMetadata;
+ if (metadata.MetadataKind == ModelMetadataKind.Property
+ && metadata.ContainerType is \{ \} containerType
+ && metadata.PropertyName is \{ \} propertyName)
+ {
+ var propertyDocId = DocumentationCommentIdHelper.CreateDocumentationId(containerType, propertyName);
+ if (XmlCommentCache.Cache.TryGetValue(DocumentationCommentIdHelper.NormalizeDocId(propertyDocId), out var propertyComment))
+ {
+ var parameter = operation.Parameters?.SingleOrDefault(p => p.Name == metadata.Name);
+ var description = propertyComment.Summary;
+ if (!string.IsNullOrEmpty(description) && !string.IsNullOrEmpty(propertyComment.Value))
+ {
+ description = $"{description}\n{propertyComment.Value}";
+ }
+ else if (string.IsNullOrEmpty(description))
+ {
+ description = propertyComment.Value;
+ }
+ if (parameter is null)
+ {
+ if (operation.RequestBody is not null)
+ {
+ operation.RequestBody.Description = description;
+ if (propertyComment.Examples?.FirstOrDefault() is \{ \} jsonString)
+ {
+ var content = operation.RequestBody.Content?.Values;
+ if (content is null)
+ {
+ continue;
+ }
+ var parsedExample = jsonString.Parse();
+ foreach (var mediaType in content)
+ {
+ mediaType.Example = parsedExample;
+ }
+ }
+ }
+ continue;
+ }
+ var targetOperationParameter = UnwrapOpenApiParameter(parameter);
+ if (targetOperationParameter is not null)
+ {
+ targetOperationParameter.Description = description;
+ if (propertyComment.Examples?.FirstOrDefault() is \{ \} jsonString)
+ {
+ targetOperationParameter.Example = jsonString.Parse();
+ }
+ }
+ }
+ }
+ }
+
+ return Task.CompletedTask;
+ }
+
+ private static OpenApiParameter UnwrapOpenApiParameter(IOpenApiParameter sourceParameter)
+ {
+ if (sourceParameter is OpenApiParameterReference parameterReference)
+ {
+ if (parameterReference.Target is OpenApiParameter target)
+ {
+ return target;
+ }
+ else
+ {
+ throw new InvalidOperationException($"The input schema must be an {nameof(OpenApiParameter)} or {nameof(OpenApiParameterReference)}.");
+ }
+ }
+ else if (sourceParameter is OpenApiParameter directParameter)
+ {
+ return directParameter;
+ }
+ else
+ {
+ throw new InvalidOperationException($"The input schema must be an {nameof(OpenApiParameter)} or {nameof(OpenApiParameterReference)}.");
+ }
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file class XmlCommentSchemaTransformer : IOpenApiSchemaTransformer
+ {
+ public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext context, CancellationToken cancellationToken)
+ {
+ // Apply comments from the type
+ if (XmlCommentCache.Cache.TryGetValue(DocumentationCommentIdHelper.NormalizeDocId(context.JsonTypeInfo.Type.CreateDocumentationId()), out var typeComment))
+ {
+ schema.Description = typeComment.Summary;
+ if (typeComment.Examples?.FirstOrDefault() is \{ \} jsonString)
+ {
+ schema.Example = jsonString.Parse();
+ }
+ }
+
+ if (context.JsonPropertyInfo is \{ AttributeProvider: PropertyInfo propertyInfo })
+ {
+ // Apply comments from the property
+ if (XmlCommentCache.Cache.TryGetValue(DocumentationCommentIdHelper.NormalizeDocId(propertyInfo.CreateDocumentationId()), out var propertyComment))
+ {
+ var description = propertyComment.Summary;
+ if (!string.IsNullOrEmpty(description) && !string.IsNullOrEmpty(propertyComment.Value))
+ {
+ description = $"{description}\n{propertyComment.Value}";
+ }
+ else if (string.IsNullOrEmpty(description))
+ {
+ description = propertyComment.Value;
+ }
+ if (schema.Metadata is null
+ || !schema.Metadata.TryGetValue("x-schema-id", out var schemaId)
+ || string.IsNullOrEmpty(schemaId as string))
+ {
+ // Inlined schema
+ schema.Description = description;
+ if (propertyComment.Examples?.FirstOrDefault() is \{ \} jsonString)
+ {
+ schema.Example = jsonString.Parse();
+ }
+ }
+ else
+ {
+ // Schema Reference
+ if (!string.IsNullOrEmpty(description))
+ {
+ schema.Metadata["x-ref-description"] = description;
+ }
+ if (propertyComment.Examples?.FirstOrDefault() is \{ \} jsonString)
+ {
+ schema.Metadata["x-ref-example"] = jsonString.Parse()!;
+ }
+ }
+ }
+ }
+ return Task.CompletedTask;
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file static class JsonNodeExtensions
+ {
+ public static JsonNode? Parse(this string? json)
+ {
+ if (json is null)
+ {
+ return null;
+ }
+
+ try
+ {
+ return JsonNode.Parse(json);
+ }
+ catch (JsonException)
+ {
+ try
+ {
+ // If parsing fails, try wrapping in quotes to make it a valid JSON string
+ return JsonNode.Parse($"\"{json.Replace("\"", "\\\"")}\"");
+ }
+ catch (JsonException)
+ {
+ return null;
+ }
+ }
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.OpenApi.SourceGenerators, Version=10.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "10.0.0.0")]
+ file static class GeneratedServiceCollectionExtensions
+ {
+ [global::System.Runtime.CompilerServices.InterceptsLocationAttribute(1, "zWiVZ/5bs1be9O0AioU4Qo0BAABQcm9ncmFtLmNz")]
+ public static IServiceCollection AddOpenApi(this IServiceCollection services)
+ {
+ return services.AddOpenApi("v1", options =>
+ {
+ options.AddSchemaTransformer(new XmlCommentSchemaTransformer());
+ options.AddOperationTransformer(new XmlCommentOperationTransformer());
+ });
+ }
+
+ }
+}
+
+```
+
+
+
+
+## Useful
+
+### Download Example (.NET C#)
+
+:::tip
+
+[Download Example project XmlCommentGenerator ](/sources/XmlCommentGenerator.zip)
+
+:::
+
+
+### Share XmlCommentGenerator
+
+
+
+https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator
+
+
+
diff --git a/v2/rscg_examples_site/docs/RSCG-Examples/index.md b/v2/rscg_examples_site/docs/RSCG-Examples/index.md
index 7c4f71bf5..f6f014b8c 100644
--- a/v2/rscg_examples_site/docs/RSCG-Examples/index.md
+++ b/v2/rscg_examples_site/docs/RSCG-Examples/index.md
@@ -1,7 +1,7 @@
---
sidebar_position: 30
-title: 239 RSCG list by category
-description: 239 RSCG list by category
+title: 240 RSCG list by category
+description: 240 RSCG list by category
slug: /rscg-examples
---
@@ -49,7 +49,7 @@ import DocCardList from '@theme/DocCardList';
## API
- Expand API =>examples:10
+ Expand API =>examples:11
@@ -100,6 +100,11 @@ import DocCardList from '@theme/DocCardList';
[immediate.apis](/docs/immediate.apis)
+
+
+
+[XmlCommentGenerator](/docs/XmlCommentGenerator)
+
@@ -1516,6 +1521,8 @@ flowchart LR;
API--> immediate.apis((immediate.apis))
+ API--> XmlCommentGenerator((XmlCommentGenerator))
+
Async--> HsuSgSync((HsuSgSync))
Async--> AsyncIt((AsyncIt))
diff --git a/v2/rscg_examples_site/docs/about.md b/v2/rscg_examples_site/docs/about.md
index 979f8c7ea..38ad69bee 100644
--- a/v2/rscg_examples_site/docs/about.md
+++ b/v2/rscg_examples_site/docs/about.md
@@ -6,7 +6,7 @@ title: About
## Content
You will find here code examples
-of 239 Roslyn Source Code Generator (RSCG)
+of 240 Roslyn Source Code Generator (RSCG)
that can be useful for you. That means, you will write more elegant and concise code - even if the generators code is not always nice to look.
## Are those examples ready for production?
diff --git a/v2/rscg_examples_site/docs/indexRSCG.md b/v2/rscg_examples_site/docs/indexRSCG.md
index 1a9fa9a6a..7e49253d6 100644
--- a/v2/rscg_examples_site/docs/indexRSCG.md
+++ b/v2/rscg_examples_site/docs/indexRSCG.md
@@ -7,9 +7,9 @@ slug: /List-of-RSCG
import useBaseUrl from '@docusaurus/useBaseUrl';
-## 239 RSCG with examples in descending chronological order
+## 240 RSCG with examples in descending chronological order
-This is the list of 239 ( 15 from Microsoft) RSCG with examples
+This is the list of 240 ( 16 from Microsoft) RSCG with examples
[See by category](/docs/rscg-examples) [See as json](/exports/RSCG.json) [See as Excel](/exports/RSCG.xlsx)
@@ -20,6 +20,7 @@ This is the list of 239 ( 15 from Microsoft) RSCG with examples
| No | Name | Date | Category |
| --------- | ----- | ---- | -------- |
+|240| [XmlCommentGenerator by Microsoft ](/docs/XmlCommentGenerator)|2025-11-09 => 09 November 2025 | [API](/docs/Categories/API) |
|239| [TUnit by Tom Longhurst ](/docs/TUnit)|2025-11-08 => 08 November 2025 | [Tests](/docs/Categories/Tests) |
|238| [TeCLI by Tyler Coles ](/docs/TeCLI)|2025-11-07 => 07 November 2025 | [CommandLine](/docs/Categories/CommandLine) |
|237| [Program by Microsoft ](/docs/Program)|2025-11-06 => 06 November 2025 | [EnhancementClass](/docs/Categories/EnhancementClass) |
@@ -260,7 +261,7 @@ This is the list of 239 ( 15 from Microsoft) RSCG with examples
|2| [RSCG_TimeBombComment by Andrei Ignat ](/docs/RSCG_TimeBombComment)|2023-04-16 => 16 April 2023 | [EnhancementProject](/docs/Categories/EnhancementProject) |
|1| [ThisAssembly by Daniel Cazzulino ](/docs/ThisAssembly)|2023-04-16 => 16 April 2023 | [EnhancementProject](/docs/Categories/EnhancementProject) |
-## 15 Created by Microsoft
+## 16 Created by Microsoft
If you are interested in Microsoft RSCG, please see
@@ -281,6 +282,7 @@ If you are interested in Microsoft RSCG, please see
|130| [MSTest by Microsoft ](/docs/MSTest)|2024-04-04 => 04 April 2024 | Tests |
|173| [Microsoft.Windows.CsWin32 by Microsoft ](/docs/Microsoft.Windows.CsWin32)|2024-12-01 => 01 December 2024 | WinAPI |
|237| [Program by Microsoft ](/docs/Program)|2025-11-06 => 06 November 2025 | EnhancementClass |
+|240| [XmlCommentGenerator by Microsoft ](/docs/XmlCommentGenerator)|2025-11-09 => 09 November 2025 | API |
If you want to study ,there are more at https://github.com/search?q=repo%3Adotnet%2Fruntime%20IIncrementalGenerator&type=code
diff --git a/v2/rscg_examples_site/src/components/HomepageFeatures/index.js b/v2/rscg_examples_site/src/components/HomepageFeatures/index.js
index ddfdd112e..61e6d20ca 100644
--- a/v2/rscg_examples_site/src/components/HomepageFeatures/index.js
+++ b/v2/rscg_examples_site/src/components/HomepageFeatures/index.js
@@ -4,7 +4,7 @@ import styles from './styles.module.css';
const FeatureList = [
{
-title: '239 Examples (15 from MSFT)',
+title: '240 Examples (16 from MSFT)',
Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
description: (
<>
diff --git a/v2/rscg_examples_site/static/exports/RSCG.json b/v2/rscg_examples_site/static/exports/RSCG.json
index 369ad5e13..97ea4aaa1 100644
--- a/v2/rscg_examples_site/static/exports/RSCG.json
+++ b/v2/rscg_examples_site/static/exports/RSCG.json
@@ -1913,6 +1913,14 @@
"Source": "https://github.com/thomhurst/TUnit",
"Category": "Tests",
"AddedOn": "2025-11-08T00:00:00"
+ },
+ {
+ "Name": "XmlCommentGenerator",
+ "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/XmlCommentGenerator",
+ "NuGet": "https://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi/",
+ "Source": "https://github.com/dotnet/dotnet/",
+ "Category": "API",
+ "AddedOn": "2025-11-09T00:00:00"
}
]
}
\ No newline at end of file
diff --git a/v2/rscg_examples_site/static/exports/RSCG.xlsx b/v2/rscg_examples_site/static/exports/RSCG.xlsx
index b34e36bac..143b97a0b 100644
Binary files a/v2/rscg_examples_site/static/exports/RSCG.xlsx and b/v2/rscg_examples_site/static/exports/RSCG.xlsx differ
diff --git a/v2/rscg_examples_site/static/sources/XmlCommentGenerator.zip b/v2/rscg_examples_site/static/sources/XmlCommentGenerator.zip
new file mode 100644
index 000000000..be9f34775
Binary files /dev/null and b/v2/rscg_examples_site/static/sources/XmlCommentGenerator.zip differ