From 4984f28f64f1dd69b5a84bec46e11f5f8225d46a Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Thu, 9 Jul 2026 13:20:23 +0200
Subject: [PATCH 01/10] Clarify MSTest.Sdk incompatibility with ASP.NET Core
(Microsoft.NET.Sdk.Web) (#54554)
* Initial plan
* Clarify MSTest.Sdk incompatibility with ASP.NET Core projects in MTP docs
* Shorten long sentence in Enable MTP section
* Update MSTest.Sdk compatibility notes in documentation
Clarify compatibility of MSTest.Sdk with project SDKs and provide instructions for manual configuration.
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Soften ASP.NET Core integration test example in NOTE callout
* Reframe manual MSTest config as a general alternative, not SDK-specific
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---
.../core/testing/unit-testing-mstest-running-tests.md | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/docs/core/testing/unit-testing-mstest-running-tests.md b/docs/core/testing/unit-testing-mstest-running-tests.md
index 150c83c95fb2b..612d3be782bcf 100644
--- a/docs/core/testing/unit-testing-mstest-running-tests.md
+++ b/docs/core/testing/unit-testing-mstest-running-tests.md
@@ -23,9 +23,9 @@ The MSTest runner is open source and builds on the [MTP](./microsoft-testing-pla
## Enable MTP in an MSTest project
-It's recommended to use [MSTest SDK](./unit-testing-mstest-sdk.md) as it greatly simplifies your project configuration and updating the project, and it ensures a proper alignment of the versions of the platform (MTP) and its extensions.
+Use [MSTest SDK](./unit-testing-mstest-sdk.md) to greatly simplify your project configuration, version management, and alignment of MTP and its extensions.
-When you use `MSTest SDK`, by default you're opted in to using MTP.
+`MSTest.Sdk` replaces `Microsoft.NET.Sdk` as the project SDK, and MTP is enabled by default:
```xml
@@ -39,7 +39,12 @@ When you use `MSTest SDK`, by default you're opted in to using MTP.
```
-Alternatively, you can enable MSTest runner by adding the `EnableMSTestRunner` property and setting `OutputType` to `Exe` in your project file. You also need to ensure that you're using `MSTest 3.2.0` or newer. We strongly recommend you update to the latest MSTest version available.
+> [!NOTE]
+> `MSTest.Sdk` works only when your project can use `Microsoft.NET.Sdk` as its base SDK. If your project requires a different SDK, don't replace the `` value with `MSTest.Sdk`.
+>
+> For example, some ASP.NET Core integration test projects use `Microsoft.NET.Sdk.Web`. `MSTest.Sdk` derives from `Microsoft.NET.Sdk`, so it doesn't import the ASP.NET Core SDK targets that `Microsoft.NET.Sdk.Web` provides.
+
+You can also configure MSTest manually instead of using `MSTest.Sdk`. Manual configuration is required when your project needs a different top-level SDK (for example, `Microsoft.NET.Sdk.Web`), but you can also choose it with the standard `Microsoft.NET.Sdk`. Add the `EnableMSTestRunner` property and set `OutputType` to `Exe` in your project file. Then add the MSTest references that your project requires. Ensure that you're using MSTest 3.2.0 or newer, and update to the latest MSTest version available.
Consider the following example project file:
From 38738e5a6f647f3eb9d27cc11b4ff6d774cbd772 Mon Sep 17 00:00:00 2001
From: Genevieve Warren <24882762+gewarren@users.noreply.github.com>
Date: Thu, 9 Jul 2026 08:34:55 -0700
Subject: [PATCH 02/10] Merge .NET Framework interop docs into standard folder
(#54717)
* merge netfx interop docs into standard folder
* Apply suggestions from code review
Co-authored-by: Genevieve Warren <24882762+gewarren@users.noreply.github.com>
* move netfx specific files back to framework folder
* fix broken links
* move two more files; fix links
* fix build warnings
* fix build errors
---
.openpublishing.redirection.framework.json | 1547 ++++++++---------
...use-platform-invoke-to-play-a-wave-file.md | 4 +-
docs/csharp/advanced-topics/interop/index.md | 12 +-
.../compiler-messages/cs1762.md | 2 +-
.../compiler-messages/cs8355.md | 2 +-
.../generic-type-parameters-errors.md | 2 +-
.../whats-new/csharp-version-history.md | 2 +-
.../callbackoncollecteddelegate-mda.md | 2 +-
.../contextswitchdeadlock-mda.md | 2 +-
.../disconnectedcontext-mda.md | 2 +-
.../exceptionswallowedoncallfromcom-mda.md | 2 +-
.../debug-trace-profile/failedqi-mda.md | 2 +-
.../gcmanagedtounmanaged-mda.md | 2 +-
.../gcunmanagedtomanaged-mda.md | 2 +-
.../illegalprepareconstrainedregion-mda.md | 2 +-
.../invalidapartmentstatechange-mda.md | 2 +-
.../invalidfunctionpointerindelegate-mda.md | 2 +-
.../invalidiunknown-mda.md | 2 +-
.../invalidmemberdeclaration-mda.md | 2 +-
.../invalidoverlappedtopinvoke-mda.md | 2 +-
.../debug-trace-profile/invalidvariant-mda.md | 2 +-
.../jitcompilationstart-mda.md | 2 +-
.../marshalcleanuperror-mda.md | 2 +-
.../debug-trace-profile/marshaling-mda.md | 2 +-
.../noncomvisiblebaseclass-mda.md | 2 +-
.../debug-trace-profile/notmarshalable-mda.md | 2 +-
.../overlappedfreeerror-mda.md | 2 +-
.../debug-trace-profile/pinvokelog-mda.md | 2 +-
.../pinvokestackimbalance-mda.md | 2 +-
.../raceonrcwcleanup-mda.md | 2 +-
.../releasehandlefailed-mda.md | 2 +-
.../reportavoncomrelease-mda.md | 2 +-
.../debug-trace-profile/virtualcercall-mda.md | 2 +-
docs/framework/deployment/index.md | 2 +-
...-framework-based-com-components-for-reg.md | 20 +-
.../interop/how-to-create-com-wrappers.md | 27 +-
.../how-to-create-wrappers-manually.md | 176 +-
...-interop-assemblies-from-type-libraries.md | 42 -
...ary-interop-assemblies-using-tlbimp-exe.md | 19 +-
...how-to-migrate-managed-code-dcom-to-wcf.md | 18 +-
...-to-register-primary-interop-assemblies.md | 19 +-
docs/framework/interop/index.md | 65 +-
.../marshalling-data-with-com-interop.md | 81 +-
.../interop/registration-free-com-interop.md | 84 +-
docs/framework/interop/toc.yml | 104 --
docs/framework/toc.yml | 20 +-
.../regasm-exe-assembly-registration-tool.md | 2 +-
.../tools/tlbimp-exe-type-library-importer.md | 2 +-
...e-application-in-the-component-designer.md | 2 +-
.../functions/external-functions.md | 2 +-
.../code-analysis/quality-rules/ca1017.md | 2 +-
.../code-analysis/quality-rules/ca1416.md | 2 +-
.../code-analysis/quality-rules/ca1418.md | 2 +-
.../code-analysis/quality-rules/ca1815.md | 2 +-
.../code-analysis/quality-rules/ca1838.md | 4 +-
docs/navigate/advanced-programming/toc.yml | 98 +-
docs/standard/assembly/create.md | 2 +-
.../handling-com-interop-exceptions.md | 2 +-
docs/standard/managed-execution-process.md | 2 +-
.../apply-interop-attributes.md | 94 +-
.../standard/native-interop/best-practices.md | 4 +-
.../blittable-and-non-blittable-types.md | 4 +-
.../native-interop}/callback-functions.md | 4 +-
.../native-interop}/calling-a-dll-function.md | 48 +-
.../native-interop/com-callable-wrapper.md | 3 +-
...nterop-sample-com-client-and-net-server.md | 16 +-
...nterop-sample-net-client-and-com-server.md | 12 +-
docs/standard/native-interop/com-wrappers.md | 1 -
docs/standard/native-interop/cominterop.md | 8 +-
.../compiling-an-interop-project.md | 22 +-
.../consuming-unmanaged-dll-functions.md | 4 +-
.../native-interop}/copying-and-pinning.md | 3 +-
.../creating-a-class-to-hold-dll-functions.md | 38 +-
.../creating-prototypes-in-managed-code.md | 336 ++--
.../default-marshalling-behavior.md | 6 +-
.../default-marshalling-for-arrays.md | 8 +-
.../default-marshalling-for-objects.md | 8 +-
.../default-marshalling-for-strings.md | 9 +-
.../deploying-an-interop-application.md | 72 +-
.../exposing-com-components.md | 63 +-
.../exposing-dotnet-components-to-com.md | 21 +-
...how-to-add-references-to-type-libraries.md | 71 +-
...-interop-assemblies-from-type-libraries.md | 45 +
.../how-to-implement-callback-functions.md | 4 +-
.../how-to-map-hresults-and-exceptions.md | 10 +-
.../how-to-reference-net-types-from-com.md | 19 +-
.../identifying-functions-in-dlls.md | 4 +-
...importing-a-type-library-as-an-assembly.md | 37 +-
docs/standard/native-interop/index.md | 13 +-
.../native-interop}/interop-marshalling.md | 14 +-
...halling-a-delegate-as-a-callback-method.md | 4 +-
...rshalling-classes-structures-and-unions.md | 8 +-
.../marshalling-data-with-platform-invoke.md | 11 +-
.../marshalling-different-types-of-arrays.md | 4 +-
.../native-interop}/marshalling-strings.md | 42 +-
.../platform-invoke-callback-process.gif | Bin
.../platform-invoke-call.gif | Bin
.../interop-marshal-copy.gif | Bin
.../interop-marshal-reference-pin.gif | Bin
...interop-variant-passed-value-reference.gif | Bin
.../com-private-deployment.gif | Bin
.../interop-and-com-marshaling.gif | Bin
.../interop-direct-ref-across-process.gif | Bin
.../interop-heaps-managed-and-unmanaged.gif | Bin
.../interop-marshaling-invoke-and-com.png | Bin
.../interop-remote-soap-or-tcp.gif | Bin
.../single-process-across-multi-apartment.gif | Bin
.../native-interop}/msgbox-sample.md | 4 +-
.../packaging-an-assembly-for-com.md | 31 +-
.../native-interop}/passing-structures.md | 4 +-
.../platform-invoke-examples.md | 6 +-
.../qualify-net-types-for-interoperation.md | 5 +-
.../registering-assemblies-with-com.md | 23 +-
.../runtime-callable-wrapper.md | 69 +-
.../csharp/PInvokeLibManaged/NativeMethods.cs | 0
.../PInvokeLibManaged.csproj | 0
.../csharp/PInvokeLibManaged/Program.cs | 0
.../vb/PInvokeLibManaged/NativeMethods.vb | 0
.../PInvokeLibManaged.vbproj | 0
.../vb/PInvokeLibManaged/Program.vb | 0
.../specifying-a-character-set.md | 4 +-
.../specifying-an-entry-point.md | 4 +-
...-equivalence-and-embedded-interop-types.md | 8 +-
.../security/impersonating-and-reverting.md | 4 +-
.../error-messages/bc30828.md | 2 +-
.../error-messages/bc40059.md | 2 +-
...erability-in-net-framework-applications.md | 4 +-
.../com-interop/how-to-call-windows-apis.md | 6 +-
.../programming-guide/com-interop/index.md | 6 +-
.../introduction-to-com-interop.md | 90 +-
.../walkthrough-calling-windows-apis.md | 8 +-
131 files changed, 1884 insertions(+), 1890 deletions(-)
delete mode 100644 docs/framework/interop/how-to-generate-interop-assemblies-from-type-libraries.md
delete mode 100644 docs/framework/interop/toc.yml
rename docs/{framework/interop => standard/native-interop}/blittable-and-non-blittable-types.md (98%)
rename docs/{framework/interop => standard/native-interop}/callback-functions.md (96%)
rename docs/{framework/interop => standard/native-interop}/calling-a-dll-function.md (72%)
rename docs/{framework/interop => standard/native-interop}/com-interop-sample-com-client-and-net-server.md (96%)
rename docs/{framework/interop => standard/native-interop}/com-interop-sample-net-client-and-com-server.md (96%)
rename docs/{framework/interop => standard/native-interop}/compiling-an-interop-project.md (70%)
rename docs/{framework/interop => standard/native-interop}/consuming-unmanaged-dll-functions.md (98%)
rename docs/{framework/interop => standard/native-interop}/copying-and-pinning.md (99%)
rename docs/{framework/interop => standard/native-interop}/creating-a-class-to-hold-dll-functions.md (83%)
rename docs/{framework/interop => standard/native-interop}/creating-prototypes-in-managed-code.md (73%)
rename docs/{framework/interop => standard/native-interop}/default-marshalling-behavior.md (98%)
rename docs/{framework/interop => standard/native-interop}/default-marshalling-for-arrays.md (97%)
rename docs/{framework/interop => standard/native-interop}/default-marshalling-for-objects.md (96%)
rename docs/{framework/interop => standard/native-interop}/default-marshalling-for-strings.md (98%)
rename docs/{framework/interop => standard/native-interop}/deploying-an-interop-application.md (50%)
rename docs/{framework/interop => standard/native-interop}/exposing-com-components.md (58%)
rename docs/{framework/interop => standard/native-interop}/exposing-dotnet-components-to-com.md (64%)
rename docs/{framework/interop => standard/native-interop}/how-to-add-references-to-type-libraries.md (54%)
create mode 100644 docs/standard/native-interop/how-to-generate-interop-assemblies-from-type-libraries.md
rename docs/{framework/interop => standard/native-interop}/how-to-implement-callback-functions.md (98%)
rename docs/{framework/interop => standard/native-interop}/how-to-map-hresults-and-exceptions.md (96%)
rename docs/{framework/interop => standard/native-interop}/how-to-reference-net-types-from-com.md (65%)
rename docs/{framework/interop => standard/native-interop}/identifying-functions-in-dlls.md (97%)
rename docs/{framework/interop => standard/native-interop}/importing-a-type-library-as-an-assembly.md (73%)
rename docs/{framework/interop => standard/native-interop}/interop-marshalling.md (92%)
rename docs/{framework/interop => standard/native-interop}/marshalling-a-delegate-as-a-callback-method.md (97%)
rename docs/{framework/interop => standard/native-interop}/marshalling-classes-structures-and-unions.md (98%)
rename docs/{framework/interop => standard/native-interop}/marshalling-data-with-platform-invoke.md (90%)
rename docs/{framework/interop => standard/native-interop}/marshalling-different-types-of-arrays.md (98%)
rename docs/{framework/interop => standard/native-interop}/marshalling-strings.md (76%)
rename docs/{framework/interop => standard/native-interop}/media/callback-functions/platform-invoke-callback-process.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/consuming-unmanaged-dll-functions/platform-invoke-call.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/copying-and-pinning/interop-marshal-copy.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/copying-and-pinning/interop-marshal-reference-pin.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/default-marshaling-for-objects/interop-variant-passed-value-reference.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/deploying-an-interop-application/com-private-deployment.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/interop-marshaling/interop-and-com-marshaling.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/interop-marshaling/interop-direct-ref-across-process.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/interop-marshaling/interop-heaps-managed-and-unmanaged.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/interop-marshaling/interop-marshaling-invoke-and-com.png (100%)
rename docs/{framework/interop => standard/native-interop}/media/interop-marshaling/interop-remote-soap-or-tcp.gif (100%)
rename docs/{framework/interop => standard/native-interop}/media/interop-marshaling/single-process-across-multi-apartment.gif (100%)
rename docs/{framework/interop => standard/native-interop}/msgbox-sample.md (97%)
rename docs/{framework/interop => standard/native-interop}/packaging-an-assembly-for-com.md (60%)
rename docs/{framework/interop => standard/native-interop}/passing-structures.md (99%)
rename docs/{framework/interop => standard/native-interop}/platform-invoke-examples.md (92%)
rename docs/{framework/interop => standard/native-interop}/registering-assemblies-with-com.md (56%)
rename docs/{framework/interop => standard/native-interop}/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/NativeMethods.cs (100%)
rename docs/{framework/interop => standard/native-interop}/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/PInvokeLibManaged.csproj (100%)
rename docs/{framework/interop => standard/native-interop}/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/Program.cs (100%)
rename docs/{framework/interop => standard/native-interop}/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/NativeMethods.vb (100%)
rename docs/{framework/interop => standard/native-interop}/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/PInvokeLibManaged.vbproj (100%)
rename docs/{framework/interop => standard/native-interop}/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/Program.vb (100%)
rename docs/{framework/interop => standard/native-interop}/specifying-a-character-set.md (98%)
rename docs/{framework/interop => standard/native-interop}/specifying-an-entry-point.md (98%)
rename docs/{framework/interop => standard/native-interop}/type-equivalence-and-embedded-interop-types.md (82%)
diff --git a/.openpublishing.redirection.framework.json b/.openpublishing.redirection.framework.json
index b0c63a3bd548e..cd45499b83117 100644
--- a/.openpublishing.redirection.framework.json
+++ b/.openpublishing.redirection.framework.json
@@ -195,213 +195,171 @@
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/add.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/add",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/add"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/audienceuris.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/audienceuris",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/audienceuris"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/caches.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/caches",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/caches"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatereference.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/certificatereference",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/certificatereference"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatevalidation.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/certificatevalidation",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/certificatevalidation"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatevalidator.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/certificatevalidator",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/certificatevalidator"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/chunkedcookiehandler.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/chunkedcookiehandler",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/chunkedcookiehandler"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimsauthenticationmanager.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/claimsauthenticationmanager",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/claimsauthenticationmanager"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimsauthorizationmanager.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/claimsauthorizationmanager",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/claimsauthorizationmanager"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimtype.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/claimtype",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/claimtype"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimtyperequired.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/claimtyperequired",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/claimtyperequired"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/clear.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/clear",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/clear"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/cookiehandler.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/cookiehandler",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/cookiehandler"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/customcookiehandler.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/customcookiehandler",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/customcookiehandler"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/federationconfiguration.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/federationconfiguration",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/federationconfiguration"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/identityconfiguration.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/identityconfiguration",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/identityconfiguration"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/index.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/index",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/index"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/issuernameregistry.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/issuernameregistry",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/issuernameregistry"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/issuertokenresolver.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/issuertokenresolver",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/issuertokenresolver"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/nameclaimtype.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/nameclaimtype",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/nameclaimtype"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/remove.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/remove",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/remove"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/roleclaimtype.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/roleclaimtype",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/roleclaimtype"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/samlsecuritytokenrequirement.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/samlsecuritytokenrequirement",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/samlsecuritytokenrequirement"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/securitytokenhandlerconfiguration.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/securitytokenhandlerconfiguration",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/securitytokenhandlerconfiguration"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/securitytokenhandlers.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/securitytokenhandlers",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/securitytokenhandlers"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/servicecertificate.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/servicecertificate",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/servicecertificate"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/servicetokenresolver.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/servicetokenresolver",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/servicetokenresolver"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/sessionsecuritytokencache.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/sessionsecuritytokencache",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/sessionsecuritytokencache"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/sessiontokenrequirement.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/sessiontokenrequirement",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/sessiontokenrequirement"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/system-identitymodel-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/system-identitymodel-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/system-identitymodel-services"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/system-identitymodel.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/system-identitymodel",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/system-identitymodel"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/tokenreplaycache.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/tokenreplaycache",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/tokenreplaycache"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/tokenreplaydetection.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/tokenreplaydetection",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/tokenreplaydetection"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/trustedissuers.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/trustedissuers",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/trustedissuers"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/usernamesecuritytokenhandlerrequirement.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/usernamesecuritytokenhandlerrequirement",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/usernamesecuritytokenhandlerrequirement"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/wsfederation.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/wsfederation",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/wsfederation"
},
{
"source_path_from_root": "/docs/framework/configure-apps/file-schema/windows-identity-foundation/x509securitytokenhandlerrequirement.md",
- "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/x509securitytokenhandlerrequirement",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/x509securitytokenhandlerrequirement"
},
{
"source_path_from_root": "/docs/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms.md",
- "redirect_url": "/previous-versions/dotnet/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms"
},
{
"source_path_from_root": "/docs/framework/cross-platform/index.md",
- "redirect_url": "/previous-versions/dotnet/framework/cross-platform/index",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/cross-platform/index"
},
{
"source_path_from_root": "/docs/framework/cross-platform/passing-a-uri-to-the-windows-runtime.md",
- "redirect_url": "/previous-versions/dotnet/framework/cross-platform/passing-a-uri-to-the-windows-runtime",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/cross-platform/passing-a-uri-to-the-windows-runtime"
},
{
"source_path_from_root": "/docs/framework/cross-platform/portable-class-library.md",
- "redirect_url": "/previous-versions/dotnet/framework/cross-platform/portable-class-library",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/cross-platform/portable-class-library"
},
{
"source_path_from_root": "/docs/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime.md",
- "redirect_url": "/previous-versions/dotnet/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime"
},
{
"source_path_from_root": "/docs/framework/cross-platform/using-portable-class-library-with-model-view-view-model.md",
@@ -469,48 +427,39 @@
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/application-security-scenarios-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/application-security-scenarios-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/application-security-scenarios-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/authentication-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/authentication-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/authentication-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/authorization-and-permissions-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/authorization-and-permissions-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/authorization-and-permissions-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/clr-integration-security-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/clr-integration-security-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/clr-integration-security-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/creating-application-roles-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/creating-application-roles-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/creating-application-roles-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/data-encryption-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/data-encryption-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/data-encryption-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/linq/linq-to-sql-with-tightly-coupled-client-server-applications.md",
@@ -518,407 +467,327 @@
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/overview-of-sql-server-security.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/overview-of-sql-server-security",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/overview-of-sql-server-security"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/server-and-database-roles-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/server-and-database-roles-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/server-and-database-roles-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/signing-stored-procedures-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/signing-stored-procedures-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/signing-stored-procedures-in-sql-server"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/sql-server-express-security.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/sql-server-express-security",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/sql-server-express-security"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/sql-server-security.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security",
- "redirect_document_id": false
- },
- {
- "source_path_from_root": "/docs/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security"
},
{
"source_path_from_root": "/docs/framework/data/adonet/sql/sqldependency-in-an-aspnet-app.md",
"redirect_url": "/dotnet/framework/data/adonet/sql/query-notifications-in-sql-server"
},
+ {
+ "source_path_from_root": "/docs/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server.md",
+ "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server"
+ },
{
"source_path_from_root": "/docs/framework/data/wcf/accessing-data-service-resources-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/accessing-data-service-resources-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/accessing-data-service-resources-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart"
},
{
"source_path_from_root": "/docs/framework/data/wcf/application-scenarios-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/application-scenarios-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/application-scenarios-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/asynchronous-operations-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/asynchronous-operations-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/asynchronous-operations-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data"
},
{
"source_path_from_root": "/docs/framework/data/wcf/batching-operations-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/batching-operations-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/batching-operations-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/binding-data-to-controls-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/binding-data-to-controls-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/binding-data-to-controls-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/calling-service-operations-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/calling-service-operations-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/calling-service-operations-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/configuring-the-data-service-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/configuring-the-data-service-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/configuring-the-data-service-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf"
},
{
"source_path_from_root": "/docs/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf"
},
{
"source_path_from_root": "/docs/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/creating-the-data-service.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/creating-the-data-service",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/creating-the-data-service"
},
{
"source_path_from_root": "/docs/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart"
},
{
"source_path_from_root": "/docs/framework/data/wcf/custom-data-service-providers-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/custom-data-service-providers-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/custom-data-service-providers-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/data-service-versioning-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/data-service-versioning-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/data-service-versioning-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/data-services-providers-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/data-services-providers-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/data-services-providers-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/defining-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/defining-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/defining-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/developing-and-deploying-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/developing-and-deploying-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/developing-and-deploying-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/entity-framework-provider-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/entity-framework-provider-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/entity-framework-provider-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/feed-customization-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/feed-customization-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/feed-customization-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/getting-started-with-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/getting-started-with-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/getting-started-with-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/hosting-the-data-service-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/hosting-the-data-service-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/hosting-the-data-service-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-load-paged-results-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-load-paged-results-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-load-paged-results-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-load-related-entities-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-load-related-entities-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-load-related-entities-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-project-query-results-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-project-query-results-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-project-query-results-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/index.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/index",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/index"
},
{
"source_path_from_root": "/docs/framework/data/wcf/interceptors-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/interceptors-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/interceptors-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/linq-considerations-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/linq-considerations-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/linq-considerations-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/loading-deferred-content-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/loading-deferred-content-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/loading-deferred-content-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/managing-the-data-service-context-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/managing-the-data-service-context-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/managing-the-data-service-context-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/number-of-entities-returned-by-a-query-wcf.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/number-of-entities-returned-by-a-query-wcf",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/number-of-entities-returned-by-a-query-wcf"
},
{
"source_path_from_root": "/docs/framework/data/wcf/object-materialization-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/object-materialization-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/object-materialization-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/query-projections-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/query-projections-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/query-projections-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/querying-the-data-service-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/querying-the-data-service-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/querying-the-data-service-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/quickstart-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/quickstart-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/quickstart-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/reflection-provider-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/reflection-provider-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/reflection-provider-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/securing-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/securing-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/securing-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/service-operations-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/service-operations-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/service-operations-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf"
},
{
"source_path_from_root": "/docs/framework/data/wcf/streaming-provider-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/streaming-provider-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/streaming-provider-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/updating-the-data-service-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/updating-the-data-service-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/updating-the-data-service-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/using-actions-to-implement-server-side-behavior.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/using-actions-to-implement-server-side-behavior",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/using-actions-to-implement-server-side-behavior"
},
{
"source_path_from_root": "/docs/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe"
},
{
"source_path_from_root": "/docs/framework/data/wcf/wcf-data-services-client-library.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-client-library",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-client-library"
},
{
"source_path_from_root": "/docs/framework/data/wcf/wcf-data-services-overview.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-overview",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-overview"
},
{
"source_path_from_root": "/docs/framework/data/wcf/wcf-data-services-protocol-implementation-details.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-protocol-implementation-details",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-protocol-implementation-details"
},
{
"source_path_from_root": "/docs/framework/data/wcf/wcf-data-services-resources.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-resources",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-resources"
},
{
"source_path_from_root": "/docs/framework/data/wcf/working-with-binary-data-wcf-data-services.md",
- "redirect_url": "/previous-versions/dotnet/framework/data/wcf/working-with-binary-data-wcf-data-services",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/data/wcf/working-with-binary-data-wcf-data-services"
},
{
"source_path_from_root": "/docs/framework/data/wcf/writing-a-windows-store-app-that-consumes-an-odata-service.md",
@@ -968,14 +837,14 @@
"source_path_from_root": "/docs/framework/docker/index.md",
"redirect_url": "/dotnet/framework"
},
- {
- "source_path_from_root": "/docs/framework/get-started/the-net-framework-and-out-of-band-releases.md",
- "redirect_url": "/dotnet/framework/get-started/out-of-band-releases"
- },
{
"source_path_from_root": "/docs/framework/get-started/net-core-and-open-source.md",
"redirect_url": "/dotnet/core/introduction"
},
+ {
+ "source_path_from_root": "/docs/framework/get-started/the-net-framework-and-out-of-band-releases.md",
+ "redirect_url": "/dotnet/framework/get-started/out-of-band-releases"
+ },
{
"source_path_from_root": "/docs/framework/install/dotnet-35-windows-10.md",
"redirect_url": "/dotnet/framework/install/dotnet-35-windows"
@@ -985,16 +854,15 @@
"redirect_url": "/dotnet/framework/install/dotnet-35-windows"
},
{
- "source_path_from_root": "/docs/framework/install/on-windows-7.md",
- "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-7",
- "redirect_document_id": false
+ "source_path_from_root": "/docs/framework/install/on-server-2019.md",
+ "redirect_url": "/dotnet/framework/install/on-windows-and-server"
},
{
- "source_path_from_root": "/docs/framework/install/on-windows-8.md",
+ "source_path_from_root": "/docs/framework/install/on-server-2022.md",
"redirect_url": "/dotnet/framework/install/on-windows-and-server"
},
{
- "source_path_from_root": "/docs/framework/install/on-windows-8-1.md",
+ "source_path_from_root": "/docs/framework/install/on-server-2025.md",
"redirect_url": "/dotnet/framework/install/on-windows-and-server"
},
{
@@ -1006,26 +874,24 @@
"redirect_url": "/dotnet/framework/install/on-windows-and-server"
},
{
- "source_path_from_root": "/docs/framework/install/on-server-2019.md",
- "redirect_url": "/dotnet/framework/install/on-windows-and-server"
+ "source_path_from_root": "/docs/framework/install/on-windows-7.md",
+ "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-7"
},
{
- "source_path_from_root": "/docs/framework/install/on-server-2022.md",
+ "source_path_from_root": "/docs/framework/install/on-windows-8-1.md",
"redirect_url": "/dotnet/framework/install/on-windows-and-server"
},
{
- "source_path_from_root": "/docs/framework/install/on-server-2025.md",
+ "source_path_from_root": "/docs/framework/install/on-windows-8.md",
"redirect_url": "/dotnet/framework/install/on-windows-and-server"
},
{
"source_path_from_root": "/docs/framework/install/on-windows-vista.md",
- "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-vista",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-vista"
},
{
"source_path_from_root": "/docs/framework/install/on-windows-xp.md",
- "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-xp",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-xp"
},
{
"source_path_from_root": "/docs/framework/install/run-net-framework-1-1-apps.md",
@@ -1033,104 +899,238 @@
},
{
"source_path_from_root": "/docs/framework/interop/applying-interop-attributes.md",
- "redirect_url": "/dotnet/standard/native-interop/apply-interop-attributes",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/apply-interop-attributes"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/blittable-and-non-blittable-types.md",
+ "redirect_url": "/dotnet/standard/native-interop/blittable-and-non-blittable-types"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/callback-functions.md",
+ "redirect_url": "/dotnet/standard/native-interop/callback-functions"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/calling-a-dll-function.md",
+ "redirect_url": "/dotnet/standard/native-interop/calling-a-dll-function"
},
{
"source_path_from_root": "/docs/framework/interop/com-callable-wrapper.md",
- "redirect_url": "/dotnet/standard/native-interop/com-callable-wrapper",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/com-callable-wrapper"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/com-interop-sample-com-client-and-net-server.md",
+ "redirect_url": "/dotnet/standard/native-interop/com-interop-sample-com-client-and-net-server"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/com-interop-sample-net-client-and-com-server.md",
+ "redirect_url": "/dotnet/standard/native-interop/com-interop-sample-net-client-and-com-server"
},
{
"source_path_from_root": "/docs/framework/interop/com-wrappers.md",
- "redirect_url": "/dotnet/standard/native-interop/com-wrappers",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/com-wrappers"
},
{
- "source_path_from_root": "/docs/framework/interop/qualifying-net-types-for-interoperation.md",
- "redirect_url": "/dotnet/standard/native-interop/qualify-net-types-for-interoperation",
- "redirect_document_id": true
+ "source_path_from_root": "/docs/framework/interop/compiling-an-interop-project.md",
+ "redirect_url": "/dotnet/standard/native-interop/compiling-an-interop-project"
},
{
- "source_path_from_root": "/docs/framework/interop/runtime-callable-wrapper.md",
- "redirect_url": "/dotnet/standard/native-interop/runtime-callable-wrapper",
- "redirect_document_id": true
+ "source_path_from_root": "/docs/framework/interop/consuming-unmanaged-dll-functions.md",
+ "redirect_url": "/dotnet/standard/native-interop/consuming-unmanaged-dll-functions"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/copying-and-pinning.md",
+ "redirect_url": "/dotnet/standard/native-interop/copying-and-pinning"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/creating-a-class-to-hold-dll-functions.md",
+ "redirect_url": "/dotnet/standard/native-interop/creating-a-class-to-hold-dll-functions"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/creating-prototypes-in-managed-code.md",
+ "redirect_url": "/dotnet/standard/native-interop/creating-prototypes-in-managed-code"
},
{
"source_path_from_root": "/docs/framework/interop/default-marshaling-behavior.md",
- "redirect_url": "/dotnet/framework/interop/default-marshalling-behavior",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/default-marshalling-behavior"
},
{
"source_path_from_root": "/docs/framework/interop/default-marshaling-for-arrays.md",
- "redirect_url": "/dotnet/framework/interop/default-marshalling-for-arrays",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/default-marshalling-for-arrays"
},
{
"source_path_from_root": "/docs/framework/interop/default-marshaling-for-objects.md",
- "redirect_url": "/dotnet/framework/interop/default-marshalling-for-objects",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/default-marshalling-for-objects"
},
{
"source_path_from_root": "/docs/framework/interop/default-marshaling-for-strings.md",
- "redirect_url": "/dotnet/framework/interop/default-marshalling-for-strings",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/default-marshalling-for-strings"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/default-marshalling-behavior.md",
+ "redirect_url": "/dotnet/standard/native-interop/default-marshalling-behavior"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/default-marshalling-for-arrays.md",
+ "redirect_url": "/dotnet/standard/native-interop/default-marshalling-for-arrays"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/default-marshalling-for-objects.md",
+ "redirect_url": "/dotnet/standard/native-interop/default-marshalling-for-objects"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/default-marshalling-for-strings.md",
+ "redirect_url": "/dotnet/standard/native-interop/default-marshalling-for-strings"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/deploying-an-interop-application.md",
+ "redirect_url": "/dotnet/standard/native-interop/deploying-an-interop-application"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/exposing-com-components.md",
+ "redirect_url": "/dotnet/standard/native-interop/exposing-com-components"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/exposing-dotnet-components-to-com.md",
+ "redirect_url": "/dotnet/standard/native-interop/exposing-dotnet-components-to-com"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/how-to-add-references-to-type-libraries.md",
+ "redirect_url": "/dotnet/standard/native-interop/how-to-add-references-to-type-libraries"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/how-to-generate-interop-assemblies-from-type-libraries.md",
+ "redirect_url": "/dotnet/standard/native-interop/how-to-generate-interop-assemblies-from-type-libraries"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/how-to-implement-callback-functions.md",
+ "redirect_url": "/dotnet/standard/native-interop/how-to-implement-callback-functions"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/how-to-map-hresults-and-exceptions.md",
+ "redirect_url": "/dotnet/standard/native-interop/how-to-map-hresults-and-exceptions"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/how-to-reference-net-types-from-com.md",
+ "redirect_url": "/dotnet/standard/native-interop/how-to-reference-net-types-from-com"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/identifying-functions-in-dlls.md",
+ "redirect_url": "/dotnet/standard/native-interop/identifying-functions-in-dlls"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/importing-a-type-library-as-an-assembly.md",
+ "redirect_url": "/dotnet/standard/native-interop/importing-a-type-library-as-an-assembly"
},
{
"source_path_from_root": "/docs/framework/interop/interop-marshaling.md",
- "redirect_url": "/dotnet/framework/interop/interop-marshalling",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/interop-marshalling"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/interop-marshalling.md",
+ "redirect_url": "/dotnet/standard/native-interop/interop-marshalling"
},
{
"source_path_from_root": "/docs/framework/interop/marshaling-a-delegate-as-a-callback-method.md",
- "redirect_url": "/dotnet/framework/interop/marshalling-a-delegate-as-a-callback-method",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-a-delegate-as-a-callback-method"
},
{
"source_path_from_root": "/docs/framework/interop/marshaling-classes-structures-and-unions.md",
- "redirect_url": "/dotnet/framework/interop/marshalling-classes-structures-and-unions",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-classes-structures-and-unions"
},
{
"source_path_from_root": "/docs/framework/interop/marshaling-data-with-com-interop.md",
- "redirect_url": "/dotnet/framework/interop/marshalling-data-with-com-interop",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/framework/interop/marshalling-data-with-com-interop"
},
{
"source_path_from_root": "/docs/framework/interop/marshaling-data-with-platform-invoke.md",
- "redirect_url": "/dotnet/framework/interop/marshalling-data-with-platform-invoke",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-data-with-platform-invoke"
},
{
"source_path_from_root": "/docs/framework/interop/marshaling-different-types-of-arrays.md",
- "redirect_url": "/dotnet/framework/interop/marshalling-different-types-of-arrays",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-different-types-of-arrays"
},
{
"source_path_from_root": "/docs/framework/interop/marshaling-strings.md",
- "redirect_url": "/dotnet/framework/interop/marshalling-strings",
- "redirect_document_id": true
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-strings"
},
{
- "source_path_from_root": "/docs/framework/mef/composition-analysis-tool-mefx.md",
- "redirect_url": "/previous-versions/dotnet/framework/mef/composition-analysis-tool-mefx",
- "redirect_document_id": false
+ "source_path_from_root": "/docs/framework/interop/marshalling-a-delegate-as-a-callback-method.md",
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-a-delegate-as-a-callback-method"
},
{
- "source_path_from_root": "/docs/framework/mef/mef-for-net-for-windows-store-apps.md",
- "redirect_url": "/previous-versions/dotnet/framework/mef/mef-for-net-for-windows-store-apps",
- "redirect_document_id": false
+ "source_path_from_root": "/docs/framework/interop/marshalling-classes-structures-and-unions.md",
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-classes-structures-and-unions"
},
{
- "source_path_from_root": "/docs/framework/mef/index.md",
- "redirect_url": "/dotnet/standard/mef/index",
- "redirect_document_id": true
+ "source_path_from_root": "/docs/framework/interop/marshalling-data-with-platform-invoke.md",
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-data-with-platform-invoke"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/marshalling-different-types-of-arrays.md",
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-different-types-of-arrays"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/marshalling-strings.md",
+ "redirect_url": "/dotnet/standard/native-interop/marshalling-strings"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/msgbox-sample.md",
+ "redirect_url": "/dotnet/standard/native-interop/msgbox-sample"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/packaging-an-assembly-for-com.md",
+ "redirect_url": "/dotnet/standard/native-interop/packaging-an-assembly-for-com"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/passing-structures.md",
+ "redirect_url": "/dotnet/standard/native-interop/passing-structures"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/platform-invoke-examples.md",
+ "redirect_url": "/dotnet/standard/native-interop/platform-invoke-examples"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/qualifying-net-types-for-interoperation.md",
+ "redirect_url": "/dotnet/standard/native-interop/qualify-net-types-for-interoperation"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/registering-assemblies-with-com.md",
+ "redirect_url": "/dotnet/standard/native-interop/registering-assemblies-with-com"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/runtime-callable-wrapper.md",
+ "redirect_url": "/dotnet/standard/native-interop/runtime-callable-wrapper"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/specifying-a-character-set.md",
+ "redirect_url": "/dotnet/standard/native-interop/specifying-a-character-set"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/specifying-an-entry-point.md",
+ "redirect_url": "/dotnet/standard/native-interop/specifying-an-entry-point"
+ },
+ {
+ "source_path_from_root": "/docs/framework/interop/type-equivalence-and-embedded-interop-types.md",
+ "redirect_url": "/dotnet/standard/native-interop/type-equivalence-and-embedded-interop-types"
},
{
"source_path_from_root": "/docs/framework/mef/attributed-programming-model-overview-mef.md",
"redirect_url": "/dotnet/standard/mef/attributed-programming-model-overview-mef",
"redirect_document_id": true
},
+ {
+ "source_path_from_root": "/docs/framework/mef/composition-analysis-tool-mefx.md",
+ "redirect_url": "/previous-versions/dotnet/framework/mef/composition-analysis-tool-mefx"
+ },
+ {
+ "source_path_from_root": "/docs/framework/mef/index.md",
+ "redirect_url": "/dotnet/standard/mef/index",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/mef/mef-for-net-for-windows-store-apps.md",
+ "redirect_url": "/previous-versions/dotnet/framework/mef/mef-for-net-for-windows-store-apps"
+ },
{
"source_path_from_root": "/docs/framework/migration-guide/application-compatibility-in-the-net-framework-4-5-1.md",
"redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
@@ -1159,14 +1159,14 @@
"source_path_from_root": "/docs/framework/migration-guide/application-compatibility-in-the-net-framework-4-7.md",
"redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
- {
- "source_path_from_root": "/docs/framework/migration-guide/how-to-determine-which-versions-are-installed.md",
- "redirect_url": "/dotnet/framework/install/how-to-determine-which-versions-are-installed"
- },
{
"source_path_from_root": "/docs/framework/migration-guide/how-to-determine-which-net-framework-updates-are-installed.md",
"redirect_url": "/dotnet/framework/install/how-to-determine-which-net-framework-updates-are-installed"
},
+ {
+ "source_path_from_root": "/docs/framework/migration-guide/how-to-determine-which-versions-are-installed.md",
+ "redirect_url": "/dotnet/framework/install/how-to-determine-which-versions-are-installed"
+ },
{
"source_path_from_root": "/docs/framework/migration-guide/migration-guide/mitigation-culture-and-asynchronous-operations.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.6.x"
@@ -1247,14 +1247,14 @@
"source_path_from_root": "/docs/framework/migration-guide/retargeting-changes-in-the-net-framework-4-7.md",
"redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
- {
- "source_path_from_root": "/docs/framework/migration-guide/retargeting/index.md",
- "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
- },
{
"source_path_from_root": "/docs/framework/migration-guide/retargeting/4.0-4.5.1.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.5.x"
},
+ {
+ "source_path_from_root": "/docs/framework/migration-guide/retargeting/4.0-4.5.2.md",
+ "redirect_url": "/dotnet/framework/migration-guide/runtime/4.5.x"
+ },
{
"source_path_from_root": "/docs/framework/migration-guide/retargeting/4.0-4.5.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.5.x"
@@ -1331,6 +1331,10 @@
"source_path_from_root": "/docs/framework/migration-guide/retargeting/4.5.1-4.6.1.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.6.x"
},
+ {
+ "source_path_from_root": "/docs/framework/migration-guide/retargeting/4.5.1-4.6.2.md",
+ "redirect_url": "/dotnet/framework/migration-guide/runtime/4.6.x"
+ },
{
"source_path_from_root": "/docs/framework/migration-guide/retargeting/4.5.1-4.6.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.6.x"
@@ -1427,6 +1431,10 @@
"source_path_from_root": "/docs/framework/migration-guide/retargeting/4.6.2-4.7.1.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.7.x"
},
+ {
+ "source_path_from_root": "/docs/framework/migration-guide/retargeting/4.6.2-4.7.2.md",
+ "redirect_url": "/dotnet/framework/migration-guide/runtime/4.7.x"
+ },
{
"source_path_from_root": "/docs/framework/migration-guide/retargeting/4.6.2-4.7.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.7.x"
@@ -1455,44 +1463,48 @@
"source_path_from_root": "/docs/framework/migration-guide/retargeting/4.7.1-4.8.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.8.x"
},
+ {
+ "source_path_from_root": "/docs/framework/migration-guide/retargeting/4.7.2-4.8.md",
+ "redirect_url": "/dotnet/framework/migration-guide/runtime/4.8.x"
+ },
{
"source_path_from_root": "/docs/framework/migration-guide/retargeting/4.8-4.8.1.md",
"redirect_url": "/dotnet/framework/migration-guide/retargeting/4.8.x"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/retargeting/4.0-4.5.2.md",
- "redirect_url": "/dotnet/framework/migration-guide/runtime/4.5.x"
+ "source_path_from_root": "/docs/framework/migration-guide/retargeting/index.md",
+ "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/retargeting/4.5.1-4.6.2.md",
- "redirect_url": "/dotnet/framework/migration-guide/runtime/4.6.x"
+ "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-5-1.md",
+ "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/retargeting/4.6.2-4.7.2.md",
- "redirect_url": "/dotnet/framework/migration-guide/runtime/4.7.x"
+ "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-5-2.md",
+ "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/retargeting/4.7.2-4.8.md",
- "redirect_url": "/dotnet/framework/migration-guide/runtime/4.8.x"
+ "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-6-1.md",
+ "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/runtime/4.0-4.5.2.md",
- "redirect_url": "/dotnet/framework/migration-guide/runtime/4.5.x"
+ "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-6-2.md",
+ "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/runtime/4.5.2-4.6.2.md",
- "redirect_url": "/dotnet/framework/migration-guide/runtime/4.6.x"
+ "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-6.md",
+ "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/runtime/4.6.2-4.7.2.md",
- "redirect_url": "/dotnet/framework/migration-guide/runtime/4.7.x"
+ "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-7.md",
+ "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/runtime/4.7.2-4.8.md",
- "redirect_url": "/dotnet/framework/migration-guide/runtime/4.8.x"
+ "source_path_from_root": "/docs/framework/migration-guide/runtime/4.0-4.5.1.md",
+ "redirect_url": "/dotnet/framework/migration-guide/runtime/4.5.x"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/runtime/4.0-4.5.1.md",
+ "source_path_from_root": "/docs/framework/migration-guide/runtime/4.0-4.5.2.md",
"redirect_url": "/dotnet/framework/migration-guide/runtime/4.5.x"
},
{
@@ -1599,6 +1611,10 @@
"source_path_from_root": "/docs/framework/migration-guide/runtime/4.5.2-4.6.1.md",
"redirect_url": "/dotnet/framework/migration-guide/runtime/4.6.x"
},
+ {
+ "source_path_from_root": "/docs/framework/migration-guide/runtime/4.5.2-4.6.2.md",
+ "redirect_url": "/dotnet/framework/migration-guide/runtime/4.6.x"
+ },
{
"source_path_from_root": "/docs/framework/migration-guide/runtime/4.5.2-4.6.md",
"redirect_url": "/dotnet/framework/migration-guide/runtime/4.6.x"
@@ -1667,6 +1683,10 @@
"source_path_from_root": "/docs/framework/migration-guide/runtime/4.6.2-4.7.1.md",
"redirect_url": "/dotnet/framework/migration-guide/runtime/4.7.x"
},
+ {
+ "source_path_from_root": "/docs/framework/migration-guide/runtime/4.6.2-4.7.2.md",
+ "redirect_url": "/dotnet/framework/migration-guide/runtime/4.7.x"
+ },
{
"source_path_from_root": "/docs/framework/migration-guide/runtime/4.6.2-4.7.md",
"redirect_url": "/dotnet/framework/migration-guide/runtime/4.7.x"
@@ -1696,32 +1716,12 @@
"redirect_url": "/dotnet/framework/migration-guide/runtime/4.8.x"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/runtime/4.8-4.8.1.md",
+ "source_path_from_root": "/docs/framework/migration-guide/runtime/4.7.2-4.8.md",
"redirect_url": "/dotnet/framework/migration-guide/runtime/4.8.x"
},
{
- "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-5-1.md",
- "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
- },
- {
- "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-5-2.md",
- "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
- },
- {
- "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-6-1.md",
- "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
- },
- {
- "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-6-2.md",
- "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
- },
- {
- "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-6.md",
- "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
- },
- {
- "source_path_from_root": "/docs/framework/migration-guide/runtime-changes-in-the-net-framework-4-7.md",
- "redirect_url": "/dotnet/framework/migration-guide/application-compatibility"
+ "source_path_from_root": "/docs/framework/migration-guide/runtime/4.8-4.8.1.md",
+ "redirect_url": "/dotnet/framework/migration-guide/runtime/4.8.x"
},
{
"source_path_from_root": "/docs/framework/migration-guide/runtime/index.md",
@@ -1737,88 +1737,71 @@
},
{
"source_path_from_root": "/docs/framework/misc/code-access-security-basics.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/code-access-security-basics",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/code-access-security-basics"
},
{
"source_path_from_root": "/docs/framework/misc/code-access-security-policy-compatibility-and-migration.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/code-access-security-policy-compatibility-and-migration",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/code-access-security-policy-compatibility-and-migration"
},
{
"source_path_from_root": "/docs/framework/misc/code-access-security.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/code-access-security",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/code-access-security"
},
{
"source_path_from_root": "/docs/framework/misc/dangerous-permissions-and-policy-administration.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/dangerous-permissions-and-policy-administration",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/dangerous-permissions-and-policy-administration"
},
{
"source_path_from_root": "/docs/framework/misc/how-to-run-partially-trusted-code-in-a-sandbox.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/how-to-run-partially-trusted-code-in-a-sandbox",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/how-to-run-partially-trusted-code-in-a-sandbox"
},
{
"source_path_from_root": "/docs/framework/misc/link-demands.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/link-demands",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/link-demands"
},
{
"source_path_from_root": "/docs/framework/misc/securing-exception-handling.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/securing-exception-handling",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/securing-exception-handling"
},
{
"source_path_from_root": "/docs/framework/misc/securing-method-access.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/securing-method-access",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/securing-method-access"
},
{
"source_path_from_root": "/docs/framework/misc/securing-wrapper-code.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/securing-wrapper-code",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/securing-wrapper-code"
},
{
"source_path_from_root": "/docs/framework/misc/security-and-public-read-only-array-fields.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-and-public-read-only-array-fields",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-and-public-read-only-array-fields"
},
{
"source_path_from_root": "/docs/framework/misc/security-and-remoting-considerations.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-and-remoting-considerations",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-and-remoting-considerations"
},
{
"source_path_from_root": "/docs/framework/misc/security-and-serialization.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-and-serialization",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-and-serialization"
},
{
"source_path_from_root": "/docs/framework/misc/security-transparent-code-level-1.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-transparent-code-level-1",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-transparent-code-level-1"
},
{
"source_path_from_root": "/docs/framework/misc/security-transparent-code-level-2.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-transparent-code-level-2",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-transparent-code-level-2"
},
{
"source_path_from_root": "/docs/framework/misc/security-transparent-code.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-transparent-code",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/security-transparent-code"
},
{
"source_path_from_root": "/docs/framework/misc/using-libraries-from-partially-trusted-code.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/using-libraries-from-partially-trusted-code",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/using-libraries-from-partially-trusted-code"
},
{
"source_path_from_root": "/docs/framework/misc/using-the-assert-method.md",
- "redirect_url": "/previous-versions/dotnet/framework/code-access-security/using-the-assert-method",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/code-access-security/using-the-assert-method"
},
{
"source_path_from_root": "/docs/framework/net-native/apis-that-rely-on-reflection.md",
@@ -1969,29 +1952,269 @@
"redirect_url": "/windows/uwp/dotnet-native/typeparameter-element-net-native"
},
{
- "source_path_from_root": "/docs/framework/network-programming/httplistener.md",
- "redirect_url": "/dotnet/api/system.net.httplistener"
+ "source_path_from_root": "/docs/framework/network-programming/accessing-the-internet-through-a-proxy.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
},
{
- "source_path_from_root": "/docs/framework/reflection-and-codedom/index.md",
- "redirect_url": "/dotnet/fundamentals/reflection/reflection"
+ "source_path_from_root": "/docs/framework/network-programming/asynchronous-client-socket-example.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
},
{
- "source_path_from_root": "/docs/framework/reflection-and-codedom/accessing-custom-attributes.md",
- "redirect_url": "/dotnet/fundamentals/reflection/accessing-custom-attributes"
+ "source_path_from_root": "/docs/framework/network-programming/asynchronous-server-socket-example.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
},
{
- "source_path_from_root": "/docs/framework/reflection-and-codedom/collectible-assemblies.md",
- "redirect_url": "/dotnet/fundamentals/reflection/collectible-assemblies"
+ "source_path_from_root": "/docs/framework/network-programming/automatic-proxy-detection.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
},
{
- "source_path_from_root": "/docs/framework/reflection-and-codedom/dynamically-loading-and-using-types.md",
- "redirect_url": "/dotnet/fundamentals/reflection/dynamically-loading-and-using-types"
+ "source_path_from_root": "/docs/framework/network-programming/changes-to-ntlm-authentication-for-httpwebrequest-in-version-3-5-sp1.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
},
{
- "source_path_from_root": "/docs/framework/reflection-and-codedom/emitting-dynamic-methods-and-assemblies.md",
- "redirect_url": "/dotnet/fundamentals/reflection/emitting-dynamic-methods-and-assemblies"
- },
+ "source_path_from_root": "/docs/framework/network-programming/changes-to-the-system-uri-namespace-in-version-2-0.md",
+ "redirect_url": "/dotnet/fundamentals/networking/overview#identifying-resources"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/connection-grouping.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/creating-internet-requests.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/deriving-from-webrequest.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/deriving-from-webresponse.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/enabling-and-disabling-ipv6.md",
+ "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#disable-or-enable-ipv6"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/handling-errors.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#http-response-errors"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-access-http-specific-properties.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-assign-user-information-to-group-connections.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-create-a-socket.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-detect-network-availability-and-address-changes.md",
+ "redirect_url": "/dotnet/fundamentals/networking/network-info#network-change-events"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-enable-a-webrequest-to-use-a-proxy-to-communicate-with-the-internet.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-get-interface-and-protocol-information.md",
+ "redirect_url": "/dotnet/fundamentals/networking/network-info#network-statistics-and-properties"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-modify-the-computer-configuration-file-to-enable-ipv6-support.md",
+ "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#disable-or-enable-ipv6"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-override-a-global-proxy-selection.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#global-default-proxy"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-ping-a-host.md",
+ "redirect_url": "/dotnet/fundamentals/networking/network-info#determine-if-a-remote-host-is-reachable"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-register-a-custom-protocol-using-webrequest.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-request-a-web-page-and-retrieve-the-results-as-a-stream.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-request-data-using-the-webrequest-class.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-retrieve-a-protocol-specific-webresponse-that-matches-a-webrequest.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-send-data-using-the-webrequest-class.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/how-to-typecast-a-webrequest-to-access-protocol-specific-properties.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/http.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/httplistener.md",
+ "redirect_url": "/dotnet/api/system.net.httplistener"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/index.md",
+ "redirect_url": "/dotnet/fundamentals/networking/overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/international-resource-identifier-support-in-system-uri.md",
+ "redirect_url": "/dotnet/fundamentals/networking/overview#identifying-resources"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/internet-protocol-version-6.md",
+ "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/introducing-pluggable-protocols.md",
+ "redirect_url": "/dotnet/fundamentals/networking/overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/ipv6-addressing.md",
+ "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#ipv6-addressing"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/ipv6-auto-configuration.md",
+ "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#ipv6-auto-configuration"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/ipv6-routing.md",
+ "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#ipv6-routing"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/listening-with-sockets.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/making-asynchronous-requests.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/managing-connections.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/nat-traversal-using-ipv6-and-teredo.md",
+ "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/network-isolation-for-windows-store-apps.md",
+ "redirect_url": "/dotnet/fundamentals/networking/overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/network-programming-how-to-topics.md",
+ "redirect_url": "/dotnet/fundamentals/networking/overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/network-programming-samples.md",
+ "redirect_url": "/dotnet/fundamentals/networking/overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/networkinformation.md",
+ "redirect_url": "/dotnet/fundamentals/networking/network-info"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/programming-pluggable-protocols.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/proxy-configuration.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/requesting-data.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/socket-code-examples.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/sockets-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/socket-performance-enhancements-in-version-3-5.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/sockets-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/sockets.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/sockets-overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/synchronous-client-socket-example.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/synchronous-server-socket-example.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/tcp-udp.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/tcp-classes"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/understanding-webrequest-problems-and-exceptions.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#http-response-errors"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/using-a-synchronous-client-socket.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/using-a-synchronous-server-socket.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/using-an-asynchronous-client-socket.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/using-an-asynchronous-server-socket.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/using-application-protocols.md",
+ "redirect_url": "/dotnet/fundamentals/networking/overview"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/using-client-sockets.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/using-streams-on-the-network.md",
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
+ },
+ {
+ "source_path_from_root": "/docs/framework/network-programming/using-tcp-services.md",
+ "redirect_url": "/dotnet/fundamentals/networking/sockets/tcp-classes"
+ },
+ {
+ "source_path_from_root": "/docs/framework/reflection-and-codedom/accessing-custom-attributes.md",
+ "redirect_url": "/dotnet/fundamentals/reflection/accessing-custom-attributes"
+ },
+ {
+ "source_path_from_root": "/docs/framework/reflection-and-codedom/collectible-assemblies.md",
+ "redirect_url": "/dotnet/fundamentals/reflection/collectible-assemblies"
+ },
+ {
+ "source_path_from_root": "/docs/framework/reflection-and-codedom/dynamically-loading-and-using-types.md",
+ "redirect_url": "/dotnet/fundamentals/reflection/dynamically-loading-and-using-types"
+ },
+ {
+ "source_path_from_root": "/docs/framework/reflection-and-codedom/emitting-dynamic-methods-and-assemblies.md",
+ "redirect_url": "/dotnet/fundamentals/reflection/emitting-dynamic-methods-and-assemblies"
+ },
{
"source_path_from_root": "/docs/framework/reflection-and-codedom/get-type-member-information.md",
"redirect_url": "/dotnet/fundamentals/reflection/get-type-member-information"
@@ -2016,6 +2239,10 @@
"source_path_from_root": "/docs/framework/reflection-and-codedom/how-to-hook-up-a-delegate-using-reflection.md",
"redirect_url": "/dotnet/fundamentals/reflection/how-to-hook-up-a-delegate-using-reflection"
},
+ {
+ "source_path_from_root": "/docs/framework/reflection-and-codedom/index.md",
+ "redirect_url": "/dotnet/fundamentals/reflection/reflection"
+ },
{
"source_path_from_root": "/docs/framework/reflection-and-codedom/reflection-and-generic-types.md",
"redirect_url": "/dotnet/fundamentals/reflection/reflection-and-generic-types"
@@ -2256,16 +2483,6 @@
"source_path_from_root": "/docs/framework/unmanaged-api/cor-prf-allowable-after-attach-bitmask.md",
"redirect_url": "/dotnet/framework/unmanaged-api/profiling/cor-prf-monitor-enumeration"
},
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/dotnet-debugging.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/index",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/clrcreateinstance-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/clrcreateinstance-function",
- "redirect_document_id": true
- },
{
"source_path_from_root": "/docs/framework/unmanaged-api/debugging/closeclrenumeration-function.md",
"redirect_url": "/dotnet/core/unmanaged-api/debugging/closeclrenumeration-function",
@@ -2276,6 +2493,11 @@
"redirect_url": "/dotnet/core/unmanaged-api/debugging/closeresumehandle-function",
"redirect_document_id": true
},
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/clrcreateinstance-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/clrcreateinstance-function",
+ "redirect_document_id": true
+ },
{
"source_path_from_root": "/docs/framework/unmanaged-api/debugging/codechunkinfo-structure.md",
"redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/codechunkinfo-structure",
@@ -2526,6 +2748,76 @@
"redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/corgcreferencetype-enumeration",
"redirect_document_id": true
},
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createdebugginginterfacefromversion-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/createdebugginginterfacefromversion-function",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createdebugginginterfacefromversion2-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/createdebugginginterfacefromversion2-function",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createdebugginginterfacefromversion3-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/createdebugginginterfacefromversion3-function",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createdebugginginterfacefromversionex-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/createdebugginginterfacefromversionex-function",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createprocessforlaunch-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/createprocessforlaunch-function",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createversionstringfrommodule-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/createversionstringfrommodule-function",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/dotnet-debugging.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/index",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/enumerateclrs-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/enumerateclrs-function",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/getstartupnotificationevent-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/getstartupnotificationevent-function",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider2-interface.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider2-interface",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider2-providelibrary2-method.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider2-providelibrary2-method",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider3-interface.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider3-interface",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider3-provideunixlibrary-method.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider3-provideunixlibrary-method",
+ "redirect_document_id": true
+ },
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider3-providewindowslibrary-method.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider3-providewindowslibrary-method",
+ "redirect_document_id": true
+ },
{
"source_path_from_root": "/docs/framework/unmanaged-api/debugging/icordebug-canlaunchorattach-method.md",
"redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/icordebug-canlaunchorattach-method",
@@ -5466,6 +5758,11 @@
"redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/ilcodekind-enumeration",
"redirect_document_id": true
},
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/libraryproviderindextype-enumeration.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/libraryproviderindextype-enumeration",
+ "redirect_document_id": true
+ },
{
"source_path_from_root": "/docs/framework/unmanaged-api/debugging/logginglevelenum-enumeration.md",
"redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/logginglevelenum-enumeration",
@@ -5477,124 +5774,59 @@
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/variablelocationtype-enumeration.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/variablelocationtype-enumeration",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/writeablemetadataupdatemode-enumeration.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/writeablemetadataupdatemode-enumeration",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/metadata/corelementtype-enumeration.md",
- "redirect_url": "/dotnet/core/unmanaged-api/metadata/enumerations/corelementtype-enumeration",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createversionstringfrommodule-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/createversionstringfrommodule-function",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createdebugginginterfacefromversion-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/createdebugginginterfacefromversion-function",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createdebugginginterfacefromversionex-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/createdebugginginterfacefromversionex-function",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createdebugginginterfacefromversion2-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/createdebugginginterfacefromversion2-function",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createdebugginginterfacefromversion3-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/createdebugginginterfacefromversion3-function",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/createprocessforlaunch-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/createprocessforlaunch-function",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/enumerateclrs-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/enumerateclrs-function",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/getstartupnotificationevent-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/getstartupnotificationevent-function",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider2-interface.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider2-interface",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider2-providelibrary2-method.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider2-providelibrary2-method",
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/pstartup_callback-function-pointer.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/pstartup_callback-function-pointer",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider3-interface.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider3-interface",
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/registerforruntimestartup-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/registerforruntimestartup-function",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider3-provideunixlibrary-method.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider3-provideunixlibrary-method",
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/registerforruntimestartup3-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/registerforruntimestartup3-function",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/iclrdebugginglibraryprovider3-providewindowslibrary-method.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/iclrdebugginglibraryprovider3-providewindowslibrary-method",
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/registerforruntimestartupex-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/registerforruntimestartupex-function",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/libraryproviderindextype-enumeration.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/libraryproviderindextype-enumeration",
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/resumeprocess-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/resumeprocess-function",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/pstartup_callback-function-pointer.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/pstartup_callback-function-pointer",
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/unregisterforruntimestartup-function.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/unregisterforruntimestartup-function",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/registerforruntimestartup-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/registerforruntimestartup-function",
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/variablelocationtype-enumeration.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/variablelocationtype-enumeration",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/registerforruntimestartupex-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/registerforruntimestartupex-function",
+ "source_path_from_root": "/docs/framework/unmanaged-api/debugging/writeablemetadataupdatemode-enumeration.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/debugging/icordebug/writeablemetadataupdatemode-enumeration",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/registerforruntimestartup3-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/registerforruntimestartup3-function",
+ "source_path_from_root": "/docs/framework/unmanaged-api/metadata/assemblymetadata-structure.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/metadata/structures/assemblymetadata-structure",
"redirect_document_id": true
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/resumeprocess-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/resumeprocess-function",
- "redirect_document_id": true
+ "source_path_from_root": "/docs/framework/unmanaged-api/metadata/assemblyrefflags-enumeration.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/metadata/enumerations/corassemblyflags-enumeration"
},
{
- "source_path_from_root": "/docs/framework/unmanaged-api/debugging/unregisterforruntimestartup-function.md",
- "redirect_url": "/dotnet/core/unmanaged-api/debugging/unregisterforruntimestartup-function",
+ "source_path_from_root": "/docs/framework/unmanaged-api/metadata/cor-field-offset-structure.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/metadata/structures/cor-field-offset-structure",
"redirect_document_id": true
},
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/metadata/assemblyrefflags-enumeration.md",
- "redirect_url": "/dotnet/core/unmanaged-api/metadata/enumerations/corassemblyflags-enumeration"
- },
{
"source_path_from_root": "/docs/framework/unmanaged-api/metadata/corassemblyflags-enumeration.md",
"redirect_url": "/dotnet/core/unmanaged-api/metadata/enumerations/corassemblyflags-enumeration",
@@ -5610,6 +5842,11 @@
"redirect_url": "/dotnet/core/unmanaged-api/metadata/enumerations/cordeclsecurity-enumeration",
"redirect_document_id": true
},
+ {
+ "source_path_from_root": "/docs/framework/unmanaged-api/metadata/corelementtype-enumeration.md",
+ "redirect_url": "/dotnet/core/unmanaged-api/metadata/enumerations/corelementtype-enumeration",
+ "redirect_document_id": true
+ },
{
"source_path_from_root": "/docs/framework/unmanaged-api/metadata/corerrorifemitoutoforder-enumeration.md",
"redirect_url": "/dotnet/core/unmanaged-api/metadata/enumerations/corerrorifemitoutoforder-enumeration",
@@ -6740,16 +6977,6 @@
"redirect_url": "/dotnet/core/unmanaged-api/metadata/interfaces/imetadatavalidate-validatorinit-method",
"redirect_document_id": true
},
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/metadata/assemblymetadata-structure.md",
- "redirect_url": "/dotnet/core/unmanaged-api/metadata/structures/assemblymetadata-structure",
- "redirect_document_id": true
- },
- {
- "source_path_from_root": "/docs/framework/unmanaged-api/metadata/cor-field-offset-structure.md",
- "redirect_url": "/dotnet/core/unmanaged-api/metadata/structures/cor-field-offset-structure",
- "redirect_document_id": true
- },
{
"source_path_from_root": "/docs/framework/unmanaged-api/metadata/osinfo-structure.md",
"redirect_url": "/dotnet/core/unmanaged-api/metadata/structures/osinfo-structure",
@@ -6966,17 +7193,11 @@
},
{
"source_path_from_root": "/docs/framework/wcf/feature-details/diff-in-queue-in-vista-server-2003-windows-xp.md",
- "redirect_url": "/previous-versions/dotnet/framework/wcf/feature-details/queuing-differences-windows-vista",
- "redirect_document_id": false
+ "redirect_url": "/previous-versions/dotnet/framework/wcf/feature-details/queuing-differences-windows-vista"
},
{
"source_path_from_root": "/docs/framework/wcf/feature-details/diff-service-certificate-validation-ie-and-wcf.md",
- "redirect_url": "/previous-versions/dotnet/framework/wcf/feature-details/service-cert-validation-differences",
- "redirect_document_id": false
- },
- {
- "source_path_from_root": "/docs/framework/wcf/feature-details/how-to-use-a-custom-user-name-and-password-validator.md",
- "redirect_url": "/previous-versions/dotnet/framework/wcf/feature-details/how-to-use-custom-user-name-password-validator"
+ "redirect_url": "/previous-versions/dotnet/framework/wcf/feature-details/service-cert-validation-differences"
},
{
"source_path_from_root": "/docs/framework/wcf/feature-details/how-to-create-a-workflow-service-that-calls-another-workflow-service.md",
@@ -6986,6 +7207,10 @@
"source_path_from_root": "/docs/framework/wcf/feature-details/how-to-host-a-non-service-workflow-in-iis.md",
"redirect_url": "/previous-versions/dotnet/netframework-4.0/ff729688(v=vs.100)"
},
+ {
+ "source_path_from_root": "/docs/framework/wcf/feature-details/how-to-use-a-custom-user-name-and-password-validator.md",
+ "redirect_url": "/previous-versions/dotnet/framework/wcf/feature-details/how-to-use-custom-user-name-password-validator"
+ },
{
"source_path_from_root": "/docs/framework/wcf/feature-details/migrate-asp-net-web-service-client-to-wcf.md",
"redirect_url": "/dotnet/framework/wcf/feature-details/adopting-wcf"
@@ -7506,6 +7731,10 @@
"redirect_url": "/dotnet/framework/windows-workflow-foundation/migration-guidance",
"redirect_document_id": true
},
+ {
+ "source_path_from_root": "/docs/framework/xaml-services/{}-escape-sequence-markup-extension.md",
+ "redirect_url": "/dotnet/desktop/xaml-services/escape-sequence-markup-extension"
+ },
{
"source_path_from_root": "/docs/framework/xaml-services/built-in-types-for-common-xaml-language-primitives.md",
"redirect_url": "/dotnet/desktop/xaml-services/types-for-primitives"
@@ -7685,254 +7914,6 @@
{
"source_path_from_root": "/docs/framework/xaml-services/xml-space-handling-in-xaml.md",
"redirect_url": "/dotnet/desktop/xaml-services/xml-space-handling"
- },
- {
- "source_path_from_root": "/docs/framework/xaml-services/{}-escape-sequence-markup-extension.md",
- "redirect_url": "/dotnet/desktop/xaml-services/escape-sequence-markup-extension"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/index.md",
- "redirect_url": "/dotnet/fundamentals/networking/overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/introducing-pluggable-protocols.md",
- "redirect_url": "/dotnet/fundamentals/networking/overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/network-programming-how-to-topics.md",
- "redirect_url": "/dotnet/fundamentals/networking/overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/requesting-data.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/creating-internet-requests.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-request-a-web-page-and-retrieve-the-results-as-a-stream.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-request-data-using-the-webrequest-class.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-send-data-using-the-webrequest-class.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-retrieve-a-protocol-specific-webresponse-that-matches-a-webrequest.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/using-streams-on-the-network.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/making-asynchronous-requests.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/handling-errors.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#http-response-errors"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/programming-pluggable-protocols.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-register-a-custom-protocol-using-webrequest.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-typecast-a-webrequest-to-access-protocol-specific-properties.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/deriving-from-webrequest.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/deriving-from-webresponse.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/using-application-protocols.md",
- "redirect_url": "/dotnet/fundamentals/networking/overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/http.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-access-http-specific-properties.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/managing-connections.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/connection-grouping.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-assign-user-information-to-group-connections.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/tcp-udp.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/tcp-classes"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/using-tcp-services.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/tcp-classes"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/sockets.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/sockets-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/using-a-synchronous-client-socket.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/using-a-synchronous-server-socket.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/using-an-asynchronous-client-socket.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/using-an-asynchronous-server-socket.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/synchronous-client-socket-example.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/synchronous-server-socket-example.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/asynchronous-client-socket-example.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/asynchronous-server-socket-example.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/listening-with-sockets.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-server"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/socket-code-examples.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/sockets-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/socket-performance-enhancements-in-version-3-5.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/sockets-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/network-programming-samples.md",
- "redirect_url": "/dotnet/fundamentals/networking/overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/network-isolation-for-windows-store-apps.md",
- "redirect_url": "/dotnet/fundamentals/networking/overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/understanding-webrequest-problems-and-exceptions.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#http-response-errors"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/using-client-sockets.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services#create-a-socket-client"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-create-a-socket.md",
- "redirect_url": "/dotnet/fundamentals/networking/sockets/socket-services"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/internet-protocol-version-6.md",
- "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/ipv6-addressing.md",
- "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#ipv6-addressing"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/ipv6-routing.md",
- "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#ipv6-routing"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/ipv6-auto-configuration.md",
- "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#ipv6-auto-configuration"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/enabling-and-disabling-ipv6.md",
- "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#disable-or-enable-ipv6"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-modify-the-computer-configuration-file-to-enable-ipv6-support.md",
- "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview#disable-or-enable-ipv6"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/networkinformation.md",
- "redirect_url": "/dotnet/fundamentals/networking/network-info"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-detect-network-availability-and-address-changes.md",
- "redirect_url": "/dotnet/fundamentals/networking/network-info#network-change-events"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-get-interface-and-protocol-information.md",
- "redirect_url": "/dotnet/fundamentals/networking/network-info#network-statistics-and-properties"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-ping-a-host.md",
- "redirect_url": "/dotnet/fundamentals/networking/network-info#determine-if-a-remote-host-is-reachable"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/accessing-the-internet-through-a-proxy.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/automatic-proxy-detection.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-override-a-global-proxy-selection.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#global-default-proxy"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/international-resource-identifier-support-in-system-uri.md",
- "redirect_url": "/dotnet/fundamentals/networking/overview#identifying-resources"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/nat-traversal-using-ipv6-and-teredo.md",
- "redirect_url": "/dotnet/fundamentals/networking/ipv6-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/proxy-configuration.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/changes-to-the-system-uri-namespace-in-version-2-0.md",
- "redirect_url": "/dotnet/fundamentals/networking/overview#identifying-resources"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/changes-to-ntlm-authentication-for-httpwebrequest-in-version-3-5-sp1.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/http-overview"
- },
- {
- "source_path_from_root": "/docs/framework/network-programming/how-to-enable-a-webrequest-to-use-a-proxy-to-communicate-with-the-internet.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
}
]
}
diff --git a/docs/csharp/advanced-topics/interop/how-to-use-platform-invoke-to-play-a-wave-file.md b/docs/csharp/advanced-topics/interop/how-to-use-platform-invoke-to-play-a-wave-file.md
index f2f6039dca047..6a6b37186de07 100644
--- a/docs/csharp/advanced-topics/interop/how-to-use-platform-invoke-to-play-a-wave-file.md
+++ b/docs/csharp/advanced-topics/interop/how-to-use-platform-invoke-to-play-a-wave-file.md
@@ -31,5 +31,5 @@ Compile and run the code.
## See also
-- [A Closer Look at Platform Invoke](../../../framework/interop/consuming-unmanaged-dll-functions.md#a-closer-look-at-platform-invoke)
-- [Marshaling Data with Platform Invoke](../../../framework/interop/marshalling-data-with-platform-invoke.md)
+- [A Closer Look at Platform Invoke](../../../standard/native-interop/consuming-unmanaged-dll-functions.md#a-closer-look-at-platform-invoke)
+- [Marshaling Data with Platform Invoke](../../../standard/native-interop/marshalling-data-with-platform-invoke.md)
diff --git a/docs/csharp/advanced-topics/interop/index.md b/docs/csharp/advanced-topics/interop/index.md
index 871914799930b..d93ba94171fcc 100644
--- a/docs/csharp/advanced-topics/interop/index.md
+++ b/docs/csharp/advanced-topics/interop/index.md
@@ -19,7 +19,7 @@ Interoperability enables you to preserve and take advantage of existing investme
*Platform invoke* is a service that enables managed code to call unmanaged functions implemented in dynamic link libraries (DLLs), such as the Microsoft Windows API. It locates and invokes an exported function and marshals its arguments (integers, strings, arrays, structures, and so on) across the interoperation boundary as needed.
-For more information, see [Consuming Unmanaged DLL Functions](../../../framework/interop/consuming-unmanaged-dll-functions.md) and [How to use platform invoke to play a WAV file](./how-to-use-platform-invoke-to-play-a-wave-file.md).
+For more information, see [Consuming Unmanaged DLL Functions](../../../standard/native-interop/consuming-unmanaged-dll-functions.md) and [How to use platform invoke to play a WAV file](./how-to-use-platform-invoke-to-play-a-wave-file.md).
> [!NOTE]
> The [Common Language Runtime](../../../standard/clr.md) (CLR) manages access to system resources. Calling unmanaged code that is outside the CLR bypasses this security mechanism, and therefore presents a security risk. For example, unmanaged code might call resources in unmanaged code directly, bypassing CLR security mechanisms. For more information, see [Security in .NET](../../../standard/security/index.md).
@@ -38,7 +38,7 @@ You can consume a COM component from a C# project. The general steps are as foll
1. Create an instance of a class defined in the RCW. Creating an instance of that class creates an instance of the COM object.
1. Use the object just as you use other managed objects. When the object is reclaimed by garbage collection, the instance of the COM object is also released from memory.
-For more information, see [Exposing COM Components to the .NET Framework](../../../framework/interop/exposing-com-components.md).
+For more information, see [Exposing COM Components to the .NET Framework](../../../standard/native-interop/exposing-com-components.md).
## Exposing C# to COM
@@ -49,13 +49,13 @@ COM clients can consume C# types that have been correctly exposed. The basic ste
1. Generate a COM type library and register it for COM usage.
You can modify C# project properties to automatically register the C# assembly for COM interop. Visual Studio uses the [Regasm.exe (Assembly Registration Tool)](../../../framework/tools/regasm-exe-assembly-registration-tool.md), using the `/tlb` command-line switch, which takes a managed assembly as input, to generate a type library. This type library describes the `public` types in the assembly and adds registry entries so that COM clients can create managed classes.
- For more information, see [Exposing .NET Framework Components to COM](../../../framework/interop/exposing-dotnet-components-to-com.md) and [Example COM Class](./example-com-class.md).
+ For more information, see [Exposing .NET Framework Components to COM](../../../standard/native-interop/exposing-dotnet-components-to-com.md) and [Example COM Class](./example-com-class.md).
## See also
- [Improving Interop Performance](/previous-versions/msp-n-p/ff647812(v=pandp.10))
- [Introduction to Interoperability between COM and .NET](/office/client-developer/outlook/pia/introduction-to-interoperability-between-com-and-net)
- [Introduction to COM Interop in Visual Basic](../../../visual-basic/programming-guide/com-interop/introduction-to-com-interop.md)
-- [Marshaling between Managed and Unmanaged Code](../../../framework/interop/interop-marshalling.md)
-- [Interoperating with Unmanaged Code](../../../framework/interop/index.md)
-- [Registering Assemblies with COM](../../../framework/interop/registering-assemblies-with-com.md)
+- [Marshaling between Managed and Unmanaged Code](../../../standard/native-interop/interop-marshalling.md)
+- [Interoperating with Unmanaged Code](../../../standard/native-interop/index.md)
+- [Registering Assemblies with COM](../../../standard/native-interop/registering-assemblies-with-com.md)
diff --git a/docs/csharp/language-reference/compiler-messages/cs1762.md b/docs/csharp/language-reference/compiler-messages/cs1762.md
index f774b2f96615c..b1e63501153ec 100644
--- a/docs/csharp/language-reference/compiler-messages/cs1762.md
+++ b/docs/csharp/language-reference/compiler-messages/cs1762.md
@@ -26,4 +26,4 @@ A reference was created to embedded interop assembly '\' because of a
## See also
- [**EmbedInteropAssembly** (C# Compiler Options)](../compiler-options/inputs.md#embedinteroptypes)
-- [Interoperating with Unmanaged Code](../../../framework/interop/index.md)
+- [Interoperating with Unmanaged Code](../../../standard/native-interop/index.md)
diff --git a/docs/csharp/language-reference/compiler-messages/cs8355.md b/docs/csharp/language-reference/compiler-messages/cs8355.md
index e428f90d5c007..2cb1c62e30981 100644
--- a/docs/csharp/language-reference/compiler-messages/cs8355.md
+++ b/docs/csharp/language-reference/compiler-messages/cs8355.md
@@ -31,5 +31,5 @@ class Program
## See also
-- [Default Marshalling Behavior](../../../framework/interop/default-marshalling-behavior.md)
+- [Default Marshalling Behavior](../../../standard/native-interop/default-marshalling-behavior.md)
- [Reference parameters](../keywords/method-parameters.md#reference-parameters)
diff --git a/docs/csharp/language-reference/compiler-messages/generic-type-parameters-errors.md b/docs/csharp/language-reference/compiler-messages/generic-type-parameters-errors.md
index 0e0365f4283c1..32c2510461db6 100644
--- a/docs/csharp/language-reference/compiler-messages/generic-type-parameters-errors.md
+++ b/docs/csharp/language-reference/compiler-messages/generic-type-parameters-errors.md
@@ -440,7 +440,7 @@ For more information, see [Constraints on type parameters](../../programming-gui
The attribute marks methods that unmanaged code can call. These methods have strict requirements because the runtime must handle the transition between managed and unmanaged calling conventions.
- Use only valid calling convention types in the `UnmanagedCallersOnly` attribute (**CS8893**). The `CallConvs` property of the attribute accepts only recognized calling convention types from the `System.Runtime.CompilerServices` namespace.
-- Use only [blittable types](/dotnet/framework/interop/blittable-and-non-blittable-types) as parameter and return types (**CS8894**). Methods marked with `UnmanagedCallersOnly` can't use managed types (such as `string` or `object`) as parameter or return types because unmanaged callers can't manage the garbage-collected references.
+- Use only [blittable types](../../../standard/native-interop/blittable-and-non-blittable-types.md) as parameter and return types (**CS8894**). Methods marked with `UnmanagedCallersOnly` can't use managed types (such as `string` or `object`) as parameter or return types because unmanaged callers can't manage the garbage-collected references.
- Remove generic type parameters from `UnmanagedCallersOnly` methods and don't declare them in generic types (**CS8895**). Unmanaged calling conventions don't support generics because the runtime can't determine the correct calling convention for generic type substitutions.
- Apply `UnmanagedCallersOnly` only to ordinary static, non-abstract, non-virtual methods or static local functions (**CS8896**). Instance methods, abstract methods, and virtual methods can't be marked with `UnmanagedCallersOnly` because unmanaged callers can't perform the dispatch mechanisms these methods require.
diff --git a/docs/csharp/whats-new/csharp-version-history.md b/docs/csharp/whats-new/csharp-version-history.md
index 329cff11c0d54..00e829b2edcf8 100644
--- a/docs/csharp/whats-new/csharp-version-history.md
+++ b/docs/csharp/whats-new/csharp-version-history.md
@@ -363,7 +363,7 @@ C# version 4.0, released with Visual Studio 2010, introduced some interesting ne
- [Dynamic binding](../language-reference/builtin-types/reference-types.md)
- [Named/optional arguments](../programming-guide/classes-and-structs/named-and-optional-arguments.md)
- [Generic covariant and contravariant](../../standard/generics/covariance-and-contravariance.md)
-- [Embedded interop types](../../framework/interop/type-equivalence-and-embedded-interop-types.md)
+- [Embedded interop types](../../standard/native-interop/type-equivalence-and-embedded-interop-types.md)
Embedded interop types eased the deployment pain of creating COM interop assemblies for your application. Generic covariance and contravariance give you more power to use generics, but they're a bit academic and probably most appreciated by framework and library authors. Named and optional parameters let you eliminate many method overloads and provide convenience. But none of those features are exactly paradigm altering.
diff --git a/docs/framework/debug-trace-profile/callbackoncollecteddelegate-mda.md b/docs/framework/debug-trace-profile/callbackoncollecteddelegate-mda.md
index 6d1a21ae657c2..bd20a3cf6120d 100644
--- a/docs/framework/debug-trace-profile/callbackoncollecteddelegate-mda.md
+++ b/docs/framework/debug-trace-profile/callbackoncollecteddelegate-mda.md
@@ -118,5 +118,5 @@ public class Entry
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
- [gcUnmanagedToManaged](gcunmanagedtomanaged-mda.md)
diff --git a/docs/framework/debug-trace-profile/contextswitchdeadlock-mda.md b/docs/framework/debug-trace-profile/contextswitchdeadlock-mda.md
index 6e6619f444f13..ce2f2cd08f755 100644
--- a/docs/framework/debug-trace-profile/contextswitchdeadlock-mda.md
+++ b/docs/framework/debug-trace-profile/contextswitchdeadlock-mda.md
@@ -71,4 +71,4 @@ A message describing the current context and the target context.
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/disconnectedcontext-mda.md b/docs/framework/debug-trace-profile/disconnectedcontext-mda.md
index fecca024161e8..cc3b497c71c83 100644
--- a/docs/framework/debug-trace-profile/disconnectedcontext-mda.md
+++ b/docs/framework/debug-trace-profile/disconnectedcontext-mda.md
@@ -51,4 +51,4 @@ The `disconnectedContext` managed debugging assistant (MDA) is activated when th
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/exceptionswallowedoncallfromcom-mda.md b/docs/framework/debug-trace-profile/exceptionswallowedoncallfromcom-mda.md
index 5c47459ae3427..8a5721ae7939e 100644
--- a/docs/framework/debug-trace-profile/exceptionswallowedoncallfromcom-mda.md
+++ b/docs/framework/debug-trace-profile/exceptionswallowedoncallfromcom-mda.md
@@ -51,4 +51,4 @@ The `exceptionSwallowedOnCallFromCOM` managed debugging assistant (MDA) is activ
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/failedqi-mda.md b/docs/framework/debug-trace-profile/failedqi-mda.md
index 9e1ac442e6fc6..4f96191e52845 100644
--- a/docs/framework/debug-trace-profile/failedqi-mda.md
+++ b/docs/framework/debug-trace-profile/failedqi-mda.md
@@ -54,4 +54,4 @@ The `failedQI` managed debugging assistant (MDA) is activated when the runtime c
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/gcmanagedtounmanaged-mda.md b/docs/framework/debug-trace-profile/gcmanagedtounmanaged-mda.md
index afc269dea7a5f..40f3459cc38ad 100644
--- a/docs/framework/debug-trace-profile/gcmanagedtounmanaged-mda.md
+++ b/docs/framework/debug-trace-profile/gcmanagedtounmanaged-mda.md
@@ -54,5 +54,5 @@ The `gcManagedToUnmanaged` managed debugging assistant (MDA) causes a garbage co
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
- [gcUnmanagedToManaged](gcunmanagedtomanaged-mda.md)
diff --git a/docs/framework/debug-trace-profile/gcunmanagedtomanaged-mda.md b/docs/framework/debug-trace-profile/gcunmanagedtomanaged-mda.md
index 50a6d834495ae..0ed63935e1730 100644
--- a/docs/framework/debug-trace-profile/gcunmanagedtomanaged-mda.md
+++ b/docs/framework/debug-trace-profile/gcunmanagedtomanaged-mda.md
@@ -55,4 +55,4 @@ The `gcUnmanagedToManaged` managed debugging assistant (MDA) causes a garbage co
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
- [gcManagedToUnmanaged](gcmanagedtounmanaged-mda.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/illegalprepareconstrainedregion-mda.md b/docs/framework/debug-trace-profile/illegalprepareconstrainedregion-mda.md
index 7f7c8c0bf0d4e..13abf4860ac5d 100644
--- a/docs/framework/debug-trace-profile/illegalprepareconstrainedregion-mda.md
+++ b/docs/framework/debug-trace-profile/illegalprepareconstrainedregion-mda.md
@@ -71,4 +71,4 @@ void MethodWithInvalidPCR()
-
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/invalidapartmentstatechange-mda.md b/docs/framework/debug-trace-profile/invalidapartmentstatechange-mda.md
index a56ac000cb872..afc69dc9ea288 100644
--- a/docs/framework/debug-trace-profile/invalidapartmentstatechange-mda.md
+++ b/docs/framework/debug-trace-profile/invalidapartmentstatechange-mda.md
@@ -81,4 +81,4 @@ namespace ApartmentStateMDA
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/invalidfunctionpointerindelegate-mda.md b/docs/framework/debug-trace-profile/invalidfunctionpointerindelegate-mda.md
index 17c1b38a55d51..190c820d716ae 100644
--- a/docs/framework/debug-trace-profile/invalidfunctionpointerindelegate-mda.md
+++ b/docs/framework/debug-trace-profile/invalidfunctionpointerindelegate-mda.md
@@ -53,4 +53,4 @@ The `invalidFunctionPointerInDelegate` managed debugging assistant (MDA) is acti
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/invalidiunknown-mda.md b/docs/framework/debug-trace-profile/invalidiunknown-mda.md
index 963de7e6de588..fc4af203c54ae 100644
--- a/docs/framework/debug-trace-profile/invalidiunknown-mda.md
+++ b/docs/framework/debug-trace-profile/invalidiunknown-mda.md
@@ -50,4 +50,4 @@ The `invalidIUnknown` managed debugging assistant (MDA) is activated when an inv
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/invalidmemberdeclaration-mda.md b/docs/framework/debug-trace-profile/invalidmemberdeclaration-mda.md
index e6f401ff5e629..0c2226b02e259 100644
--- a/docs/framework/debug-trace-profile/invalidmemberdeclaration-mda.md
+++ b/docs/framework/debug-trace-profile/invalidmemberdeclaration-mda.md
@@ -50,4 +50,4 @@ The `invalidMemberDeclaration` managed debugging assistant (MDA) is activated to
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/invalidoverlappedtopinvoke-mda.md b/docs/framework/debug-trace-profile/invalidoverlappedtopinvoke-mda.md
index 46c2873b71ba4..659ae5ebace79 100644
--- a/docs/framework/debug-trace-profile/invalidoverlappedtopinvoke-mda.md
+++ b/docs/framework/debug-trace-profile/invalidoverlappedtopinvoke-mda.md
@@ -77,4 +77,4 @@ The `invalidOverlappedToPinvoke` managed debugging assistant (MDA) is activated
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/invalidvariant-mda.md b/docs/framework/debug-trace-profile/invalidvariant-mda.md
index 630dc90cebbea..8358fb54f4399 100644
--- a/docs/framework/debug-trace-profile/invalidvariant-mda.md
+++ b/docs/framework/debug-trace-profile/invalidvariant-mda.md
@@ -50,4 +50,4 @@ The `invalidVariant` managed debugging assistant (MDA) is activated when an inva
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/jitcompilationstart-mda.md b/docs/framework/debug-trace-profile/jitcompilationstart-mda.md
index f5a24da7dbea8..de0b2f6049fec 100644
--- a/docs/framework/debug-trace-profile/jitcompilationstart-mda.md
+++ b/docs/framework/debug-trace-profile/jitcompilationstart-mda.md
@@ -164,4 +164,4 @@ namespace ns2
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/marshalcleanuperror-mda.md b/docs/framework/debug-trace-profile/marshalcleanuperror-mda.md
index e01318131f034..5421a64bce485 100644
--- a/docs/framework/debug-trace-profile/marshalcleanuperror-mda.md
+++ b/docs/framework/debug-trace-profile/marshalcleanuperror-mda.md
@@ -52,4 +52,4 @@ The `marshalCleanupError` managed debugging assistant (MDA) is activated when th
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/marshaling-mda.md b/docs/framework/debug-trace-profile/marshaling-mda.md
index c0e73fbe57a37..24f04ba56421d 100644
--- a/docs/framework/debug-trace-profile/marshaling-mda.md
+++ b/docs/framework/debug-trace-profile/marshaling-mda.md
@@ -53,4 +53,4 @@ The MDA configuration allows you to filter the reported marshalling information
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshalling](../interop/interop-marshalling.md)
+- [Interop Marshalling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/noncomvisiblebaseclass-mda.md b/docs/framework/debug-trace-profile/noncomvisiblebaseclass-mda.md
index ae0f435725f11..186f9480c8348 100644
--- a/docs/framework/debug-trace-profile/noncomvisiblebaseclass-mda.md
+++ b/docs/framework/debug-trace-profile/noncomvisiblebaseclass-mda.md
@@ -59,4 +59,4 @@ constrained by the COM versioning rules.
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/notmarshalable-mda.md b/docs/framework/debug-trace-profile/notmarshalable-mda.md
index 6556ffce42340..c9be48f6a0d58 100644
--- a/docs/framework/debug-trace-profile/notmarshalable-mda.md
+++ b/docs/framework/debug-trace-profile/notmarshalable-mda.md
@@ -53,4 +53,4 @@ The `notMarshalable` managed debugging assistant (MDA) is activated when the com
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/overlappedfreeerror-mda.md b/docs/framework/debug-trace-profile/overlappedfreeerror-mda.md
index e3d806f8f0b58..7b94e5b38d496 100644
--- a/docs/framework/debug-trace-profile/overlappedfreeerror-mda.md
+++ b/docs/framework/debug-trace-profile/overlappedfreeerror-mda.md
@@ -55,4 +55,4 @@ The `overlappedFreeError` managed debugging assistant (MDA) is activated when th
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/pinvokelog-mda.md b/docs/framework/debug-trace-profile/pinvokelog-mda.md
index 5fe63b8b03012..6997126aed5bc 100644
--- a/docs/framework/debug-trace-profile/pinvokelog-mda.md
+++ b/docs/framework/debug-trace-profile/pinvokelog-mda.md
@@ -45,4 +45,4 @@ The `pInvokeLog` managed debugging assistant (MDA) is activated for each unique
## See also
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Consuming Unmanaged DLL Functions](../interop/consuming-unmanaged-dll-functions.md)
+- [Consuming Unmanaged DLL Functions](../../standard/native-interop/consuming-unmanaged-dll-functions.md)
diff --git a/docs/framework/debug-trace-profile/pinvokestackimbalance-mda.md b/docs/framework/debug-trace-profile/pinvokestackimbalance-mda.md
index 80fd9f90007a9..460a552d1e06b 100644
--- a/docs/framework/debug-trace-profile/pinvokestackimbalance-mda.md
+++ b/docs/framework/debug-trace-profile/pinvokestackimbalance-mda.md
@@ -59,4 +59,4 @@ The MDA message gives the name of the platform invoke method call that is causin
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/raceonrcwcleanup-mda.md b/docs/framework/debug-trace-profile/raceonrcwcleanup-mda.md
index 513329c50ca73..5997379835c79 100644
--- a/docs/framework/debug-trace-profile/raceonrcwcleanup-mda.md
+++ b/docs/framework/debug-trace-profile/raceonrcwcleanup-mda.md
@@ -51,4 +51,4 @@ The `raceOnRCWCleanup` managed debugging assistant (MDA) is activated when the c
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/releasehandlefailed-mda.md b/docs/framework/debug-trace-profile/releasehandlefailed-mda.md
index dd6f660897de4..78cf9e96ab8bd 100644
--- a/docs/framework/debug-trace-profile/releasehandlefailed-mda.md
+++ b/docs/framework/debug-trace-profile/releasehandlefailed-mda.md
@@ -96,4 +96,4 @@ bool ReleaseHandle()
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/reportavoncomrelease-mda.md b/docs/framework/debug-trace-profile/reportavoncomrelease-mda.md
index b2ce9d194397b..d93f7ed10b275 100644
--- a/docs/framework/debug-trace-profile/reportavoncomrelease-mda.md
+++ b/docs/framework/debug-trace-profile/reportavoncomrelease-mda.md
@@ -53,4 +53,4 @@ The `reportAvOnComRelease` managed debugging assistant (MDA) is activated when e
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/debug-trace-profile/virtualcercall-mda.md b/docs/framework/debug-trace-profile/virtualcercall-mda.md
index f13629675393b..d22a7749c1e16 100644
--- a/docs/framework/debug-trace-profile/virtualcercall-mda.md
+++ b/docs/framework/debug-trace-profile/virtualcercall-mda.md
@@ -100,4 +100,4 @@ void MethodWithCer(MyClass object)
-
- [Diagnosing Errors with Managed Debugging Assistants](diagnosing-errors-with-managed-debugging-assistants.md)
-- [Interop Marshaling](../interop/interop-marshalling.md)
+- [Interop Marshaling](../../standard/native-interop/interop-marshalling.md)
diff --git a/docs/framework/deployment/index.md b/docs/framework/deployment/index.md
index 0b806bd39b509..ad9b54b986c47 100644
--- a/docs/framework/deployment/index.md
+++ b/docs/framework/deployment/index.md
@@ -165,7 +165,7 @@ Security considerations can also affect how you deploy your application. Securit
|[Deploying Applications, Services, and Components](/visualstudio/deployment/deploying-applications-services-and-components)|Discusses deployment options in Visual Studio, including instructions for publishing an application using the ClickOnce and Windows Installer technologies.|
|[Publishing ClickOnce Applications](/visualstudio/deployment/publishing-clickonce-applications)|Describes how to package a Windows Forms application and deploy it with ClickOnce to client computers on a network.|
|[Package and Deploy resources](../../core/extensions/package-and-deploy-resources.md)|Describes the hub and spoke model that the .NET Framework uses to package and deploy resources; covers resource naming conventions, fallback process, and packaging alternatives.|
-|[Deploying an Interop Application](../interop/deploying-an-interop-application.md)|Explains how to ship and install interop applications, which typically include a .NET Framework client assembly, one or more interop assemblies representing distinct COM type libraries, and one or more registered COM components.|
+|[Deploying an Interop Application](../../standard/native-interop/deploying-an-interop-application.md)|Explains how to ship and install interop applications, which typically include a .NET Framework client assembly, one or more interop assemblies representing distinct COM type libraries, and one or more registered COM components.|
|[How to: Get Progress from the .NET Framework 4.5 Installer](how-to-get-progress-from-the-dotnet-installer.md)|Describes how to silently launch and track the .NET Framework setup process while showing your own view of the setup progress.|
## See also
diff --git a/docs/framework/interop/configure-net-framework-based-com-components-for-reg.md b/docs/framework/interop/configure-net-framework-based-com-components-for-reg.md
index def0841ddd9b8..ad1e0f439df68 100644
--- a/docs/framework/interop/configure-net-framework-based-com-components-for-reg.md
+++ b/docs/framework/interop/configure-net-framework-based-com-components-for-reg.md
@@ -1,25 +1,27 @@
---
-title: "How to: Configure .NET Framework-Based COM Components for Registration-Free Activation"
-description: Configure .NET-based COM components for registration-free activation. The setup requires a Win32-style application manifest and a .NET component manifest.
-ms.date: "03/30/2017"
+title: "How to: Configure .NET Framework-based COM components for registration-free activation"
+description: Configure .NET Framework-based COM components for registration-free activation. The setup requires a Win32-style application manifest and a .NET Framework component manifest.
+ms.date: 07/08/2026
+ai-usage: ai-assisted
ms.topic: how-to
helpviewer_keywords:
- "components [.NET Framework], manifest"
- "application manifests [.NET Framework]"
- "manifests [.NET Framework]"
- - "registration-free COM interop, configuring .NET-based components"
+ - "registration-free COM interop, configuring .NET Framework-based components"
- "activation, registration-free"
-ms.assetid: 32f8b7c6-3f73-455d-8e13-9846895bd43b
---
-# How to: Configure .NET Framework-Based COM Components for Registration-Free Activation
+# How to: Configure .NET Framework-based COM components for registration-free activation
+
+> [!NOTE]
+> This guidance is specific to .NET Framework. For modern .NET COM interop, use source-generated COM interop or the `System.Runtime.InteropServices.ComWrappers` API. For more information, see [COM interop overview](../../standard/native-interop/cominterop.md) and [COM source generation](../../standard/native-interop/comwrappers-source-generation.md).
Registration-free activation for .NET Framework-based components is only slightly more complicated than it is for COM components. The setup requires two manifests:
- COM applications must have a Win32-style application manifest to identify the managed component.
-
- .NET Framework-based components must have a component manifest for activation information needed at runtime.
- This topic describes how to associate an application manifest with an application; associate a component manifest with a component; and embed a component manifest in an assembly.
+This article describes how to associate an application manifest with an application; associate a component manifest with a component; and embed a component manifest in an assembly.
## Create an application manifest
@@ -149,7 +151,7 @@ You can install an application manifest in the same directory as the COM applica
You must embed the component manifest as a resource in the assembly.
-#### To embed a component manifest in a managed assembly
+### Embed a component manifest in a managed assembly
1. Create a resource script that contains the following statement:
diff --git a/docs/framework/interop/how-to-create-com-wrappers.md b/docs/framework/interop/how-to-create-com-wrappers.md
index e0929d2aee678..29af86b913218 100644
--- a/docs/framework/interop/how-to-create-com-wrappers.md
+++ b/docs/framework/interop/how-to-create-com-wrappers.md
@@ -1,13 +1,17 @@
---
-title: "How to: Create COM Wrappers"
-description: Create Component Object Model (COM) wrappers using Visual Studio or .NET tools (Tlbimp.exe and Regasm.exe). Both methods generate two types of COM wrappers.
-ms.date: "03/30/2017"
+title: "How to: Create COM wrappers"
+description: Create Component Object Model (COM) wrappers using Visual Studio or .NET Framework tools (Tlbimp.exe and Regasm.exe). Both methods generate two types of COM wrappers.
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "COM,wrappers creating"
- "COM,wrappers Visual Studio"
ms.assetid: bdf89bea-1623-45ee-a57b-cf7c90395efa
---
-# How to: Create COM Wrappers
+# How to: Create COM wrappers
+
+> [!NOTE]
+> This guidance is specific to .NET Framework. For modern .NET COM interop, use source-generated COM interop or the `System.Runtime.InteropServices.ComWrappers` API. For more information, see [COM interop overview](../../standard/native-interop/cominterop.md) and [COM source generation](../../standard/native-interop/comwrappers-source-generation.md).
You can create Component Object Model (COM) wrappers by using Visual Studio features or the .NET Framework tools Tlbimp.exe and Regasm.exe. Both methods generate two types of COM wrappers:
@@ -17,19 +21,16 @@ You can create Component Object Model (COM) wrappers by using Visual Studio feat
In Visual Studio, you can add the COM wrapper as a reference to your project.
-## Wrap COM Objects in a Managed Application
+## Wrap COM objects in a managed application
### To create a runtime callable wrapper using Visual Studio
1. Open the project for your managed application.
-
2. On the **Project** menu, click **Show All Files**.
-
3. On the **Project** menu, click **Add Reference**.
-
4. In the Add Reference dialog box, click the **COM** tab, select the component you want to use, and click **OK**.
- In **Solution Explorer**, note that the COM component is added to the References folder in your project.
+ In **Solution Explorer**, note that the COM component is added to the References folder in your project.
You can now write code to access the COM object. You can begin by declaring the object, such as with an `Imports` statement for Visual Basic or a `Using` directive for C#.
@@ -38,11 +39,11 @@ You can now write code to access the COM object. You can begin by declaring the
### To create a runtime callable wrapper using .NET Framework tools
-- Run the [Tlbimp.exe (Type Library Importer)](../tools/tlbimp-exe-type-library-importer.md) tool.
+- Run the [Tlbimp.exe (Type Library Importer)](../../framework/tools/tlbimp-exe-type-library-importer.md) tool.
This tool creates an assembly that contains runtime metadata for the types defined in the original type library.
-## Wrap Managed Objects in a Native Application
+## Wrap managed objects in a native application
### To create a COM callable wrapper using Visual Studio
@@ -60,11 +61,11 @@ You can now write code to access the COM object. You can begin by declaring the
### To create a COM callable wrapper using .NET Framework tools
-Run the [Regasm.exe (Assembly Registration Tool)](../tools/regasm-exe-assembly-registration-tool.md) tool.
+Run the [Regasm.exe (Assembly Registration Tool)](../../framework/tools/regasm-exe-assembly-registration-tool.md) tool.
This tool reads the assembly metadata and adds the necessary entries to the registry. As a result, COM clients can create .NET Framework classes transparently. You can use the assembly as if it were a native COM class.
-You can run Regasm.exe on an assembly located in any directory, and then run the [Gacutil.exe (Global Assembly Cache Tool)](../tools/gacutil-exe-gac-tool.md) to move it to the global assembly cache. Moving the assembly does not invalidate location registry entries, because the global assembly cache is always examined if the assembly is not found elsewhere.
+You can run Regasm.exe on an assembly located in any directory, and then run the [Gacutil.exe (Global Assembly Cache Tool)](../../framework/tools/gacutil-exe-gac-tool.md) to move it to the global assembly cache. Moving the assembly does not invalidate location registry entries, because the global assembly cache is always examined if the assembly is not found elsewhere.
## See also
diff --git a/docs/framework/interop/how-to-create-wrappers-manually.md b/docs/framework/interop/how-to-create-wrappers-manually.md
index 1b7039bb41248..c063bee915243 100644
--- a/docs/framework/interop/how-to-create-wrappers-manually.md
+++ b/docs/framework/interop/how-to-create-wrappers-manually.md
@@ -1,99 +1,103 @@
---
-title: "How to: Create Wrappers Manually"
+title: "How to: Create wrappers manually"
description: Create wrappers of COM types manually. Use an existing IDL file or type library, or create managed declarations and export the assembly to a type library.
-ms.date: "03/30/2017"
-helpviewer_keywords:
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
- "wrappers, creating manually"
ms.assetid: cc2a70d8-6a58-4071-a8cf-ce28c018c09b
---
-# How to: Create Wrappers Manually
-
-If you decide to declare COM types manually in managed source code, the best place to start is with an existing Interface Definition Language (IDL) file or type library. When you do not have the IDL file or cannot generate a type library file, you can simulate the COM types by creating managed declarations and exporting the resulting assembly to a type library.
-
-### To simulate COM types from managed source
-
-1. Declare the types in a language that is compliant with the Common Language Specification (CLS) and compile the file.
-
-2. Export the assembly containing the types with the [Type Library Exporter (Tlbexp.exe)](../tools/tlbexp-exe-type-library-exporter.md).
-
-3. Use the exported COM type library as a basis for declaring COM-oriented managed types.
-
-### To create a runtime callable wrapper (RCW)
-
-1. Assuming that you have an IDL file or type library file, decide which classes and interfaces you want to include in the custom RCW. You can exclude any types that you do not intend to use directly or indirectly in your application.
-
-2. Create a source file in a CLS-compliant language and declare the types. See [Type Library to Assembly Conversion Summary](/previous-versions/dotnet/netframework-4.0/k83zzh38(v=vs.100)) for a complete description of the import conversion process. Effectively, when you create a custom RCW, you are manually performing the type conversion activity provided by the [Type Library Importer (Tlbimp.exe)](../tools/tlbimp-exe-type-library-importer.md). The example in the next section shows types in an IDL or type library file and their corresponding types in C# code.
-
-3. When the declarations are complete, compile the file as you compile any other managed source code.
-
-4. As with the types imported with Tlbimp.exe, some require additional information, which you can add directly to your code. For details, see [How to: Edit Interop Assemblies](/previous-versions/dotnet/netframework-4.0/8zbc969t(v=vs.100)).
-
-## Example
-
- The following code shows an example of the `ISATest` interface and `SATest` class in IDL and the corresponding types in C# source code.
-
- **IDL or type library file**
-
+# How to: Create wrappers manually
+
+> [!NOTE]
+> This guidance is specific to .NET Framework. For modern .NET COM interop, use source-generated COM interop or the `System.Runtime.InteropServices.ComWrappers` API. For more information, see [COM interop overview](../../standard/native-interop/cominterop.md) and [COM source generation](../../standard/native-interop/comwrappers-source-generation.md).
+
+If you decide to declare COM types manually in managed source code, the best place to start is with an existing Interface Definition Language (IDL) file or type library. When you do not have the IDL file or cannot generate a type library file, you can simulate the COM types by creating managed declarations and exporting the resulting assembly to a type library.
+
+## Simulate COM types from managed source
+
+1. Declare the types in a language that is compliant with the Common Language Specification (CLS) and compile the file.
+
+2. Export the assembly containing the types with the [Type Library Exporter (Tlbexp.exe)](../tools/tlbexp-exe-type-library-exporter.md).
+
+3. Use the exported COM type library as a basis for declaring COM-oriented managed types.
+
+## Create a runtime callable wrapper (RCW)
+
+1. Assuming that you have an IDL file or type library file, decide which classes and interfaces you want to include in the custom RCW. You can exclude any types that you do not intend to use directly or indirectly in your application.
+
+2. Create a source file in a CLS-compliant language and declare the types. See [Type Library to Assembly Conversion Summary](/previous-versions/dotnet/netframework-4.0/k83zzh38(v=vs.100)) for a complete description of the import conversion process. Effectively, when you create a custom RCW, you are manually performing the type conversion activity provided by the [Type Library Importer (Tlbimp.exe)](../tools/tlbimp-exe-type-library-importer.md). The example in the next section shows types in an IDL or type library file and their corresponding types in C# code.
+
+3. When the declarations are complete, compile the file as you compile any other managed source code.
+
+4. As with the types imported with Tlbimp.exe, some require additional information, which you can add directly to your code. For details, see [How to: Edit Interop Assemblies](/previous-versions/dotnet/netframework-4.0/8zbc969t(v=vs.100)).
+
+## Example
+
+ The following code shows an example of the `ISATest` interface and `SATest` class in IDL and the corresponding types in C# source code.
+
+ **IDL or type library file**
+
```cpp
- [
-object,
-uuid(40A8C65D-2448-447A-B786-64682CBEF133),
-dual,
-helpstring("ISATest Interface"),
-pointer_default(unique)
- ]
-interface ISATest : IDispatch
- {
+ [
+object,
+uuid(40A8C65D-2448-447A-B786-64682CBEF133),
+dual,
+helpstring("ISATest Interface"),
+pointer_default(unique)
+ ]
+interface ISATest : IDispatch
+ {
[id(1), helpstring("method InSArray")]
-HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum);
- };
- [
-uuid(116CCA1E-7E39-4515-9849-90790DA6431E),
-helpstring("SATest Class")
- ]
-coclass SATest
- {
- [default] interface ISATest;
- };
-```
-
- **Wrapper in managed source code**
-
-```csharp
-using System;
-using System.Runtime.InteropServices;
-using System.Runtime.CompilerServices;
-
-[assembly:Guid("E4A992B8-6F5C-442C-96E7-C4778924C753")]
-[assembly:ImportedFromTypeLib("SAServerLib")]
-namespace SAServer
-{
- [ComImport]
- [Guid("40A8C65D-2448-447A-B786-64682CBEF133")]
- [TypeLibType(TypeLibTypeFlags.FLicensed)]
- public interface ISATest
- {
- [DispId(1)]
- //[MethodImpl(MethodImplOptions.InternalCall,
- // MethodCodeType=MethodCodeType.Runtime)]
- int InSArray( [MarshalAs(UnmanagedType.SafeArray,
- SafeArraySubType=VarEnum.VT_I4)] ref int[] param );
+HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum);
+ };
+ [
+uuid(116CCA1E-7E39-4515-9849-90790DA6431E),
+helpstring("SATest Class")
+ ]
+coclass SATest
+ {
+ [default] interface ISATest;
+ };
+```
+
+ **Wrapper in managed source code**
+
+```csharp
+using System;
+using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
+
+[assembly:Guid("E4A992B8-6F5C-442C-96E7-C4778924C753")]
+[assembly:ImportedFromTypeLib("SAServerLib")]
+namespace SAServer
+{
+ [ComImport]
+ [Guid("40A8C65D-2448-447A-B786-64682CBEF133")]
+ [TypeLibType(TypeLibTypeFlags.FLicensed)]
+ public interface ISATest
+ {
+ [DispId(1)]
+ //[MethodImpl(MethodImplOptions.InternalCall,
+ // MethodCodeType=MethodCodeType.Runtime)]
+ int InSArray( [MarshalAs(UnmanagedType.SafeArray,
+ SafeArraySubType=VarEnum.VT_I4)] ref int[] param );
}
- [ComImport]
- [Guid("116CCA1E-7E39-4515-9849-90790DA6431E")]
- [ClassInterface(ClassInterfaceType.None)]
- [TypeLibType(TypeLibTypeFlags.FCanCreate)]
- public class SATest : ISATest
- {
- [DispId(1)]
+ [ComImport]
+ [Guid("116CCA1E-7E39-4515-9849-90790DA6431E")]
+ [ClassInterface(ClassInterfaceType.None)]
+ [TypeLibType(TypeLibTypeFlags.FCanCreate)]
+ public class SATest : ISATest
+ {
+ [DispId(1)]
[MethodImpl(MethodImplOptions.InternalCall,
- MethodCodeType=MethodCodeType.Runtime)]
+ MethodCodeType=MethodCodeType.Runtime)]
extern int ISATest.InSArray( [MarshalAs(UnmanagedType.SafeArray,
- SafeArraySubType=VarEnum.VT_I4)] ref int[] param );
- }
-}
-```
-
+ SafeArraySubType=VarEnum.VT_I4)] ref int[] param );
+ }
+}
+```
+
## See also
- [Customizing Runtime Callable Wrappers](/previous-versions/dotnet/netframework-4.0/e753eftz(v=vs.100))
diff --git a/docs/framework/interop/how-to-generate-interop-assemblies-from-type-libraries.md b/docs/framework/interop/how-to-generate-interop-assemblies-from-type-libraries.md
deleted file mode 100644
index a5cd18eab1e08..0000000000000
--- a/docs/framework/interop/how-to-generate-interop-assemblies-from-type-libraries.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-title: "How to: Generate Interop Assemblies from Type Libraries"
-description: Generate interop assemblies from type libraries. Use Type Library Importer (Tlbimp.exe) to convert coclasses and interfaces from a COM type library to metadata.
-ms.date: "03/30/2017"
-helpviewer_keywords:
- - "importing type library"
- - "interop assemblies, generating"
- - "Type Library Importer"
- - "type libraries"
- - "COM interop, importing type library"
-ms.assetid: 4afd40c3-68f2-41c5-8ec1-4951bc148b9c
----
-# How to: Generate Interop Assemblies from Type Libraries
-
-The [Type Library Importer (Tlbimp.exe)](../tools/tlbimp-exe-type-library-importer.md) is a command-line tool that converts the coclasses and interfaces contained in a COM type library to metadata. This tool creates an interop assembly and namespace for the type information automatically. After the metadata of a class is available, managed clients can create instances of the COM type and call its methods, just as if it were a .NET instance. Tlbimp.exe converts an entire type library to metadata at once and cannot generate type information for a subset of the types defined in a type library.
-
-### To generate an interop assembly from a type library
-
-1. Use the following command:
-
- **tlbimp** \<*type-library-file*>
-
- Adding the **/out:** switch produces an interop assembly with an altered name, such as LOANLib.dll. Altering the interop assembly name can help distinguish it from the original COM DLL and prevent problems that can occur from having duplicate names.
-
-## Example
-
- The following command produces the Loanlib.dll assembly in the `Loanlib` namespace.
-
-```console
-tlbimp Loanlib.tlb
-```
-
- The following command produces an interop assembly with an altered name (LOANLib.dll).
-
-```console
-tlbimp LoanLib.tlb /out: LOANLib.dll
-```
-
-## See also
-
-- [Importing a Type Library as an Assembly](importing-a-type-library-as-an-assembly.md)
-- [Exposing COM Components to the .NET Framework](exposing-com-components.md)
diff --git a/docs/framework/interop/how-to-generate-primary-interop-assemblies-using-tlbimp-exe.md b/docs/framework/interop/how-to-generate-primary-interop-assemblies-using-tlbimp-exe.md
index 5254b294e4027..64e2db735e873 100644
--- a/docs/framework/interop/how-to-generate-primary-interop-assemblies-using-tlbimp-exe.md
+++ b/docs/framework/interop/how-to-generate-primary-interop-assemblies-using-tlbimp-exe.md
@@ -1,14 +1,18 @@
---
-title: "How to: Generate Primary Interop Assemblies Using Tlbimp.exe"
+title: "How to: Generate primary interop assemblies using Tlbimp.exe"
description: Learn how to generate primary interop assemblies using the Type Library Importer (Tlbimp.exe) that's provided by the Windows SDK.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "primary interop assemblies, generating"
- "Tlbimp.exe"
- "Type Library Importer"
ms.assetid: 5419011c-6e57-40f6-8c65-386db8f7a651
---
-# How to: Generate Primary Interop Assemblies Using Tlbimp.exe
+# How to: Generate primary interop assemblies using Tlbimp.exe
+
+> [!NOTE]
+> This guidance is specific to .NET Framework. For modern .NET COM interop, use source-generated COM interop or the `System.Runtime.InteropServices.ComWrappers` API. For more information, see [COM interop overview](../../standard/native-interop/cominterop.md) and [COM source generation](../../standard/native-interop/comwrappers-source-generation.md).
There are two ways to generate a primary interop assembly:
@@ -17,24 +21,21 @@ There are two ways to generate a primary interop assembly:
The most straightforward way to produce primary interop assemblies is to use the [Tlbimp.exe (Type Library Importer)](../tools/tlbimp-exe-type-library-importer.md). Tlbimp.exe provides the following safeguards:
- Checks for other registered primary interop assemblies before creating new interop assemblies for any nested type library references.
-
- Fails to emit the primary interop assembly if you do not specify either the container or file name to give the primary interop assembly a strong name.
-
- Fails to emit a primary interop assembly if you omit references to dependent assemblies.
-
- Fails to emit a primary interop assembly if you add references to dependent assemblies that are not primary interop assemblies.
- Creating primary interop assemblies manually in source code by using a language that is compliant with the Common Language Specification (CLS), such as C#. This approach is useful when a type library is unavailable.
You must have a cryptographic key pair to sign the assembly with a strong name. For details, see [Creating A Key Pair](../../standard/assembly/create-public-private-key-pair.md).
-### To generate a primary interop assembly using Tlbimp.exe
+## Generate a primary interop assembly using Tlbimp.exe
1. At the command prompt, type:
- **tlbimp** *tlbfile* **/primary /keyfile:** *filename* **/out:** *assemblyname*
+ **tlbimp** *tlbfile* **/primary /keyfile:** *filename* **/out:** *assemblyname*
- In this command, *tlbfile* is the file containing the COM type library, *filename* is the name of the container or file that contains the key pair, and *assemblyname* is the name of the assembly to sign with a strong name.
+ In this command, *tlbfile* is the file containing the COM type library, *filename* is the name of the container or file that contains the key pair, and *assemblyname* is the name of the assembly to sign with a strong name.
Primary interop assemblies can reference only other primary interop assemblies. If your assembly references types from a third-party COM type library, you must obtain a primary interop assembly from the publisher before you can generate your primary interop assembly. If you are the publisher, you must generate a primary interop assembly for the dependent type library before generating the referencing primary interop assembly.
diff --git a/docs/framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md b/docs/framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md
index 975e762ba32b5..7f9c9fb746084 100644
--- a/docs/framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md
+++ b/docs/framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md
@@ -1,18 +1,16 @@
---
-title: "How to: Migrate Managed-Code DCOM to WCF"
+title: "How to: Migrate managed-code DCOM to WCF"
description: Migrate Distributed Component Object Model (DCOM) managed code calls between servers and clients to Windows Communication Foundation (WCF).
-ms.date: "03/30/2017"
-ms.assetid: 52961ffc-d1c7-4f83-832c-786444b951ba
+ms.date: 07/08/2026
+ai-usage: ai-assisted
---
-# How to: Migrate Managed-Code DCOM to WCF
+# How to: Migrate managed-code DCOM to WCF
-Windows Communication Foundation (WCF) is the recommended and secure choice over Distributed Component Object Model (DCOM) for managed code calls between servers and clients in a distributed environment. This article shows how you to migrate code from DCOM to WCF for the following scenarios.
+Windows Communication Foundation (WCF) is recommended over Distributed Component Object Model (DCOM) for managed code calls between servers and clients in a distributed environment. This article shows how you to migrate code from DCOM to WCF for the following scenarios:
-- The remote service returns an object by-value to the client
-
-- The client sends an object by-value to the remote service
-
-- The remote service returns an object by-reference to the client
+- The remote service returns an object by-value to the client.
+- The client sends an object by-value to the remote service.
+- The remote service returns an object by-reference to the client.
For security reasons, sending an object by-reference from the client to the service is not allowed in WCF. A scenario that requires a conversation back and forth between client and server can be achieved in WCF using a duplex service. For more information about duplex services, see [Duplex Services](../wcf/feature-details/duplex-services.md).
diff --git a/docs/framework/interop/how-to-register-primary-interop-assemblies.md b/docs/framework/interop/how-to-register-primary-interop-assemblies.md
index 79bbd98240bf3..20f3dd1856f21 100644
--- a/docs/framework/interop/how-to-register-primary-interop-assemblies.md
+++ b/docs/framework/interop/how-to-register-primary-interop-assemblies.md
@@ -1,13 +1,17 @@
---
-title: "How to: Register Primary Interop Assemblies"
+title: "How to: Register primary interop assemblies"
description: Register primary interop assemblies using the Assembly Registration Tool (Regasm.exe), and read about other issues related to interop assemblies.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "registering primary interop assemblies"
- "primary interop assemblies, registering"
ms.assetid: 4b2fcf8a-429d-43ce-8334-e026040be8bb
---
-# How to: Register Primary Interop Assemblies
+# How to: Register primary interop assemblies
+
+> [!NOTE]
+> This guidance is specific to .NET Framework. For modern .NET COM interop, use source-generated COM interop or the `System.Runtime.InteropServices.ComWrappers` API. For more information, see [COM interop overview](../../standard/native-interop/cominterop.md) and [COM source generation](../../standard/native-interop/comwrappers-source-generation.md).
Classes can be marshalled only by COM interop and are always marshalled as interfaces. In some cases the interface used to marshal the class is known as the class interface. For information about overriding the class interface with an interface of your choice, see [COM Callable Wrapper](../../standard/native-interop/com-callable-wrapper.md).
@@ -22,18 +26,17 @@ Classes can be marshalled only by COM interop and are always marshalled as inter
Although it is not necessary to register primary interop assemblies unless you plan to use Visual Studio, registration provides two advantages:
- A registered primary interop assembly is clearly marked under the registry key of the original type library. Registration is the best way for you to locate a primary interop assembly on your computer.
-
- You can avoid accidentally generating and using a new interop assembly if, at some time in the future, you do use Visual Studio to reference a type for which you have an unregistered primary interop assembly.
Use the [Assembly Registration Tool (Regasm.exe)](../tools/regasm-exe-assembly-registration-tool.md) to register a primary interop assembly.
-## To register a primary interop assembly
+## Register a primary interop assembly
-1. At the command prompt, type:
+To register a primary interop assembly, at the command prompt, type:
- **regasm** *assemblyname*
+`regasm `
- In this command, *assemblyname* is the file name of the assembly that is registered. Regasm.exe adds an entry for the primary interop assembly under the same registry key as the original type library.
+In this command, *assemblyname* is the file name of the assembly that is registered. Regasm.exe adds an entry for the primary interop assembly under the same registry key as the original type library.
## Example
diff --git a/docs/framework/interop/index.md b/docs/framework/interop/index.md
index eb03a1aadf5da..ca18687015c00 100644
--- a/docs/framework/interop/index.md
+++ b/docs/framework/interop/index.md
@@ -1,56 +1,23 @@
---
-title: "Interoperating with unmanaged code"
-description: Review interoperation with unmanaged code. The CLR conceals from clients and servers how the object models of .NET components and unmanaged code differ.
-ms.date: "01/17/2018"
-helpviewer_keywords:
- - "unmanaged code, interoperation"
- - "managed code, interoperation with unmanaged code"
- - ".NET Framework, interoperation with unmanaged code"
- - "unmanaged code"
- - "interoperation with unmanaged code"
- - "interoperation with unmanaged code, about interoperation"
- - "components [.NET Framework], interoperation with unmanaged code"
-ms.assetid: ccb68ce7-b0e9-4ffb-839d-03b1cd2c1258
+title: Interoperate with unmanaged code - .NET Framework
+description: Learn about native interoperability in .NET Framework and find links to .NET Framework-specific COM interop guidance.
+ms.date: 07/08/2026
+ai-usage: ai-assisted
---
-# Interoperating with unmanaged code
-The .NET Framework promotes interaction with COM components, COM+ services, external type libraries, and many operating system services. Data types, method signatures, and error-handling mechanisms vary between managed and unmanaged object models. To simplify interoperation between .NET Framework components and unmanaged code and to ease the migration path, the common language runtime conceals from both clients and servers the differences in these object models.
+# Interoperate with unmanaged code
-Code that executes under the control of the runtime is called managed code. Conversely, code that runs outside the runtime is called unmanaged code. COM components, ActiveX interfaces, and Windows API functions are examples of unmanaged code.
+Native interoperability is the set of techniques that let managed .NET code communicate with unmanaged APIs and components. Common scenarios include calling Win32 APIs, working with COM components, and exchanging types across managed and native boundaries.
-## In this section
+For the main native interop guidance, including modern .NET content, see [Native interoperability](../../standard/native-interop/index.md).
-[Exposing COM Components to the .NET Framework](exposing-com-components.md)
-Describes how to use COM components from .NET Framework applications.
+This section contains .NET Framework-specific COM interop guidance:
-[Exposing .NET Framework Components to COM](exposing-dotnet-components-to-com.md)
-Describes how to use .NET Framework components from COM applications.
-
-[Consuming Unmanaged DLL Functions](consuming-unmanaged-dll-functions.md)
-Describes how to call unmanaged DLL functions using platform invoke.
-
-[Interop Marshaling](interop-marshalling.md)
-Describes marshalling for COM interop and platform invoke.
-
-[How to: Map HRESULTs and Exceptions](how-to-map-hresults-and-exceptions.md)
-Describes the mapping between exceptions and HRESULTs.
-
-[Type Equivalence and Embedded Interop Types](type-equivalence-and-embedded-interop-types.md)
-Describes how type information for COM types is embedded in assemblies, and how the common language runtime determines the equivalence of embedded COM types.
-
-[How to: Generate Primary Interop Assemblies Using Tlbimp.exe](how-to-generate-primary-interop-assemblies-using-tlbimp-exe.md)
-Describes how to produce primary interop assemblies using *Tlbimp.exe* (Type Library Importer).
-
-[How to: Register Primary Interop Assemblies](how-to-register-primary-interop-assemblies.md)
-Describes how to register the primary interop assemblies before you can reference them in your projects.
-
-[Registration-Free COM Interop](registration-free-com-interop.md)
-Describes how COM interop can activate components without using the Windows registry.
-
-[How to: Configure .NET Framework-Based COM Components for Registration-Free Activation](configure-net-framework-based-com-components-for-reg.md)
-Describes how to create an application manifest and how to create and embed a component manifest.
-
-## Related sections
-
-[COM Wrappers](../../standard/native-interop/com-wrappers.md)
-Describes the wrappers provided by COM interop.
+- [Registration-free COM interop](registration-free-com-interop.md)
+- [How to: Create COM wrappers](how-to-create-com-wrappers.md)
+- [How to: Create wrappers manually](how-to-create-wrappers-manually.md)
+- [Marshalling data with COM interop](marshalling-data-with-com-interop.md)
+- [How to: Migrate managed-code DCOM to WCF](how-to-migrate-managed-code-dcom-to-wcf.md)
+- [How to: Generate primary interop assemblies using Tlbimp.exe](how-to-generate-primary-interop-assemblies-using-tlbimp-exe.md)
+- [How to: Register primary interop assemblies](how-to-register-primary-interop-assemblies.md)
+- [How to: Configure .NET Framework-based COM components for registration-free activation](configure-net-framework-based-com-components-for-reg.md)
diff --git a/docs/framework/interop/marshalling-data-with-com-interop.md b/docs/framework/interop/marshalling-data-with-com-interop.md
index c4cca7d8390ac..25be9ccd62401 100644
--- a/docs/framework/interop/marshalling-data-with-com-interop.md
+++ b/docs/framework/interop/marshalling-data-with-com-interop.md
@@ -1,50 +1,51 @@
---
-title: "Marshalling Data with COM Interop"
+title: "Marshalling data with COM interop"
description: See articles covering the marshalling of data with COM interop. The Tlbimp.exe and Tlbexp.exe tools convert between a COM type library and an interop assembly.
-ms.date: "09/07/2017"
-helpviewer_keywords:
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
- "COM interop, data marshalling"
- "marshaling data, COM interop"
---
-# Marshalling Data with COM Interop
-
-COM interop provides support for both using COM objects from managed code and exposing managed objects to COM. Support for marshalling data to and from COM is extensive and almost always provides the correct marshalling behavior.
-
- The Windows SDK includes the following COM interop tools:
-
-- [Type Library Importer (Tlbimp.exe)](../tools/tlbimp-exe-type-library-importer.md), which converts a COM type library to an interop assembly. From this assembly, the interop marshalling service generates wrappers that perform data marshalling between managed and unmanaged memory.
-
-- [Type Library Exporter (Tlbexp.exe)](../tools/tlbexp-exe-type-library-exporter.md), which produces a COM type library from an assembly and generates a wrapper that performs marshalling during method calls.
-
- The following sections link to topics that describe the processes for customizing interop wrappers when you can (or must) supply the marshaller with additional type information.
-
-## In This Section
+# Marshalling data with COM interop
+
+COM interop provides support for both using COM objects from managed code and exposing managed objects to COM. Support for marshalling data to and from COM is extensive and almost always provides the correct marshalling behavior.
+
+ The Windows SDK includes the following COM interop tools:
+
+- [Type Library Importer (Tlbimp.exe)](../tools/tlbimp-exe-type-library-importer.md), which converts a COM type library to an interop assembly. From this assembly, the interop marshalling service generates wrappers that perform data marshalling between managed and unmanaged memory.
+
+- [Type Library Exporter (Tlbexp.exe)](../tools/tlbexp-exe-type-library-exporter.md), which produces a COM type library from an assembly and generates a wrapper that performs marshalling during method calls.
+
+ The following sections link to topics that describe the processes for customizing interop wrappers when you can (or must) supply the marshaller with additional type information.
+
+## In this section
[How to: Create Wrappers Manually](how-to-create-wrappers-manually.md)
Describes how to create a COM wrapper manually in managed source code.
- [How to: Migrate Managed-Code DCOM to WCF](how-to-migrate-managed-code-dcom-to-wcf.md)
- Describes how to migrate managed DCOM code to WCF for the most secure solution.
-
-## Related Sections
-
- [COM Data Types](/previous-versions/dotnet/netframework-4.0/sak564ww(v=vs.100))
- Provides corresponding managed and unmanaged data types.
-
- [Customizing COM Callable Wrappers](/previous-versions/dotnet/netframework-4.0/3bwc828w(v=vs.100))
- Describes how to explicitly marshal data types using the attribute at design time.
-
- [Customizing Runtime Callable Wrappers](/previous-versions/dotnet/netframework-4.0/e753eftz(v=vs.100))
- Describes how to adjust the marshalling behavior of types in an interop assembly and how to define COM types manually.
-
- [Advanced COM Interoperability](/previous-versions/dotnet/netframework-4.0/bd9cdfyx(v=vs.100))
- Provides links to more information about incorporating COM components into your .NET Framework application.
-
- [Assembly to Type Library Conversion Summary](/previous-versions/dotnet/netframework-4.0/xk1120c3(v=vs.100))
- Describes the assembly to type library export conversion process.
-
- [Type Library to Assembly Conversion Summary](/previous-versions/dotnet/netframework-4.0/k83zzh38(v=vs.100))
- Describes the type library to assembly import conversion process.
-
- [Interoperating Using Generic Types](/previous-versions/dotnet/netframework-4.0/ms229590(v=vs.100))
+ [How to: Migrate Managed-Code DCOM to WCF](how-to-migrate-managed-code-dcom-to-wcf.md)
+ Describes how to migrate managed DCOM code to WCF for the most secure solution.
+
+## Related sections
+
+ [COM Data Types](/previous-versions/dotnet/netframework-4.0/sak564ww(v=vs.100))
+ Provides corresponding managed and unmanaged data types.
+
+ [Customizing COM Callable Wrappers](/previous-versions/dotnet/netframework-4.0/3bwc828w(v=vs.100))
+ Describes how to explicitly marshal data types using the attribute at design time.
+
+ [Customizing Runtime Callable Wrappers](/previous-versions/dotnet/netframework-4.0/e753eftz(v=vs.100))
+ Describes how to adjust the marshalling behavior of types in an interop assembly and how to define COM types manually.
+
+ [Advanced COM Interoperability](/previous-versions/dotnet/netframework-4.0/bd9cdfyx(v=vs.100))
+ Provides links to more information about incorporating COM components into your .NET application.
+
+ [Assembly to Type Library Conversion Summary](/previous-versions/dotnet/netframework-4.0/xk1120c3(v=vs.100))
+ Describes the assembly to type library export conversion process.
+
+ [Type Library to Assembly Conversion Summary](/previous-versions/dotnet/netframework-4.0/k83zzh38(v=vs.100))
+ Describes the type library to assembly import conversion process.
+
+ [Interoperating Using Generic Types](/previous-versions/dotnet/netframework-4.0/ms229590(v=vs.100))
Describes which actions are supported when using generic types for COM interoperability.
diff --git a/docs/framework/interop/registration-free-com-interop.md b/docs/framework/interop/registration-free-com-interop.md
index 05318cf017a0e..e2c7443b75285 100644
--- a/docs/framework/interop/registration-free-com-interop.md
+++ b/docs/framework/interop/registration-free-com-interop.md
@@ -1,8 +1,9 @@
---
-title: "Registration-Free COM Interop"
+title: "Registration-free COM interop"
description: Use registration-free COM interop to activate a component without using the Windows registry to store assembly information.
-ms.date: "03/30/2017"
-helpviewer_keywords:
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
- "assemblies [.NET Framework], interop"
- "COM interop, registration-free COM interop"
- "registration-free COM interop"
@@ -10,44 +11,45 @@ helpviewer_keywords:
- "registration-free activation"
- "object activation"
- "registration-free COM interop, about registration-free COM interop"
-ms.assetid: 90f308b9-82dc-414a-bce1-77e0155e56bd
---
-# Registration-Free COM Interop
-
-Registration-free COM interop activates a component without using the Windows registry to store assembly information. Instead of registering a component on a computer during deployment, you create Win32-style manifest files at design time that contain information about binding and activation. These manifest files, rather than registry keys, direct the activation of an object.
-
- Using registration-free activation for your assemblies instead of registering them during deployment offers two advantages:
-
-- You can control which DLL version is activated when more than one version is installed on a computer.
-
-- End users can use XCOPY or FTP to copy your application to an appropriate directory on their computer. The application can then be run from that directory.
-
- This section describes the two types of manifests needed for registration-free COM interop: application and component manifests. These manifests are XML files. An application manifest, which is created by an application developer, contains metadata that describes assemblies and assembly dependencies. A component manifest, created by a component developer, contains information otherwise located in the Windows registry.
-
-### Requirements for registration-free COM interop
-
-1. Support for registration-free COM interop varies slightly depending on the type of library assembly; specifically, whether the assembly is unmanaged (COM side-by-side) or managed (.NET-based). The following table shows the operating system and .NET Framework version requirements for each assembly type.
-
- |Assembly type|Operating system|.NET Framework version|
- |-------------------|----------------------|----------------------------|
- |COM side-by-side|Microsoft Windows XP|Not required.|
- |.NET-based|Windows XP with SP2|NET Framework version 1.1 or later.|
-
- The Windows Server 2003 family also supports registration-free COM interop for .NET-based assemblies.
-
- For a .NET-based class to be compatible with registry-free activation from COM, the class must have a parameterless constructor and must be public.
-
-### Configuring COM components for registration-free activation
-
-1. For a COM component to participate in registration-free activation, it must be deployed as a side-by-side assembly. Side-by-side assemblies are unmanaged assemblies. For more information, see [Using Side-by-side Assemblies](/windows/desktop/SbsCs/using-side-by-side-assemblies).
-
- To use COM side-by-side assemblies, a .NET-based application developer must provide an application manifest, which contains the binding and activation information. Support for unmanaged side-by-side assemblies is built into the Windows XP operating system. The COM runtime, supported by the operating system, scans an application manifest for activation information when the component being activated is not in the registry.
-
- Registration-free activation is optional for COM components installed on Windows XP. For detailed instructions on adding a side-by-side assembly to an application, see [Using Side-by-side Assemblies](/windows/desktop/SbsCs/using-side-by-side-assemblies).
-
- > [!NOTE]
- > Side-by-side execution is a .NET Framework feature that enables multiple versions of the runtime, and multiple versions of applications and components that use a version of the runtime, to run on the same computer at the same time. Side-by-side execution and side-by-side assemblies are different mechanisms for providing side-by-side functionality.
-
+# Registration-free COM interop
+
+> [!NOTE]
+> This guidance is specific to .NET Framework. For modern .NET COM interop, use source-generated COM interop or the `System.Runtime.InteropServices.ComWrappers` API. For more information, see [COM interop overview](../../standard/native-interop/cominterop.md) and [COM source generation](../../standard/native-interop/comwrappers-source-generation.md).
+
+Registration-free COM interop activates a component without using the Windows registry to store assembly information. Instead of registering a component on a computer during deployment, you create Win32-style manifest files at design time that contain information about binding and activation. These manifest files, rather than registry keys, direct the activation of an object.
+
+ Using registration-free activation for your assemblies instead of registering them during deployment offers two advantages:
+
+- You can control which DLL version is activated when more than one version is installed on a computer.
+- End users can use XCOPY or FTP to copy your application to an appropriate directory on their computer. The application can then be run from that directory.
+
+This section describes the two types of manifests needed for registration-free COM interop: application and component manifests. These manifests are XML files. An application manifest, which is created by an application developer, contains metadata that describes assemblies and assembly dependencies. A component manifest, created by a component developer, contains information otherwise located in the Windows registry.
+
+### Requirements for registration-free COM interop
+
+Support for registration-free COM interop varies slightly depending on the type of library assembly; specifically, whether the assembly is unmanaged (COM side-by-side) or managed (.NET Framework-based). The following table shows the operating system and .NET Framework version requirements for each assembly type.
+
+|Assembly type|Operating system|.NET Framework version|
+|-------------------|----------------------|----------------------------|
+|COM side-by-side|Microsoft Windows XP|Not required.|
+|.NET Framework-based|Windows XP with SP2|.NET Framework version 1.1 or later.|
+
+The Windows Server 2003 family also supports registration-free COM interop for .NET Framework-based assemblies.
+
+For a .NET Framework-based class to be compatible with registry-free activation from COM, the class must have a parameterless constructor and must be public.
+
+### Configure COM components for registration-free activation
+
+For a COM component to participate in registration-free activation, it must be deployed as a side-by-side assembly. Side-by-side assemblies are unmanaged assemblies. For more information, see [Using Side-by-side Assemblies](/windows/desktop/SbsCs/using-side-by-side-assemblies).
+
+To use COM side-by-side assemblies, a .NET Framework-based application developer must provide an application manifest, which contains the binding and activation information. Support for unmanaged side-by-side assemblies is built into the Windows XP operating system. The COM runtime, supported by the operating system, scans an application manifest for activation information when the component being activated is not in the registry.
+
+Registration-free activation is optional for COM components installed on Windows XP. For detailed instructions on adding a side-by-side assembly to an application, see [Using Side-by-side Assemblies](/windows/desktop/SbsCs/using-side-by-side-assemblies).
+
+> [!NOTE]
+> Side-by-side execution is a .NET Framework feature that enables multiple versions of the runtime, and multiple versions of applications and components that use a version of the runtime, to run on the same computer at the same time. Side-by-side execution and side-by-side assemblies are different mechanisms for providing side-by-side functionality.
+
## See also
-- [How to: Configure .NET Framework-Based COM Components for Registration-Free Activation](configure-net-framework-based-com-components-for-reg.md)
+- [How to: Configure .NET Framework-based COM components for registration-free activation](configure-net-framework-based-com-components-for-reg.md)
diff --git a/docs/framework/interop/toc.yml b/docs/framework/interop/toc.yml
deleted file mode 100644
index 1d4bd4391c95e..0000000000000
--- a/docs/framework/interop/toc.yml
+++ /dev/null
@@ -1,104 +0,0 @@
-items:
-- name: Interoperate with unmanaged code
- href: index.md
-- name: Expose COM components to .NET Framework
- href: exposing-com-components.md
- items:
- - name: Importing a Type Library as an Assembly
- href: importing-a-type-library-as-an-assembly.md
- - name: "How to: Add References to Type Libraries"
- href: how-to-add-references-to-type-libraries.md
- - name: "How to: Generate Interop Assemblies from Type Libraries"
- href: how-to-generate-interop-assemblies-from-type-libraries.md
- - name: Compiling an Interop Project
- href: compiling-an-interop-project.md
- - name: Deploying an Interop Application
- href: deploying-an-interop-application.md
- - name: "COM Interop Sample: .NET Client and COM Server"
- href: com-interop-sample-net-client-and-com-server.md
-- name: Exposing .NET Framework Components to COM
- href: exposing-dotnet-components-to-com.md
- items:
- - name: Packaging an Assembly for COM
- href: packaging-an-assembly-for-com.md
- - name: Registering Assemblies with COM
- href: registering-assemblies-with-com.md
- - name: "How to: Reference .NET Types from COM"
- href: how-to-reference-net-types-from-com.md
- - name: "COM Interop Sample: COM Client and .NET Server"
- href: com-interop-sample-com-client-and-net-server.md
-- name: Consuming Unmanaged DLL Functions
- href: consuming-unmanaged-dll-functions.md
- items:
- - name: Identifying Functions in DLLs
- href: identifying-functions-in-dlls.md
- - name: Creating a Class to Hold DLL Functions
- href: creating-a-class-to-hold-dll-functions.md
- - name: Creating Prototypes in Managed Code
- href: creating-prototypes-in-managed-code.md
- items:
- - name: Specifying an Entry Point
- href: specifying-an-entry-point.md
- - name: Specifying a Character Set
- href: specifying-a-character-set.md
- - name: Platform Invoke Examples
- href: platform-invoke-examples.md
- - name: Calling a DLL Function
- href: calling-a-dll-function.md
- items:
- - name: Passing Structures
- href: passing-structures.md
- - name: Callback Functions
- href: callback-functions.md
- - name: "How to: Implement Callback Functions"
- href: how-to-implement-callback-functions.md
-- name: Interop Marshaling
- href: interop-marshalling.md
- items:
- - name: Default Marshalling Behavior
- href: default-marshalling-behavior.md
- items:
- - name: Blittable and Non-Blittable Types
- href: blittable-and-non-blittable-types.md
- - name: Copying and Pinning
- href: copying-and-pinning.md
- - name: Default Marshalling for Arrays
- href: default-marshalling-for-arrays.md
- - name: Default Marshalling for Objects
- href: default-marshalling-for-objects.md
- - name: Default Marshalling for Strings
- href: default-marshalling-for-strings.md
- - name: Marshalling Data with Platform Invoke
- href: marshalling-data-with-platform-invoke.md
- items:
- - name: Marshalling Strings
- href: marshalling-strings.md
- - name: MsgBox Sample
- href: msgbox-sample.md
- - name: Marshalling Classes, Structures, and Unions
- href: marshalling-classes-structures-and-unions.md
- - name: Marshalling Different Types of Arrays
- href: marshalling-different-types-of-arrays.md
- - name: Marshalling a Delegate as a Callback Method
- href: marshalling-a-delegate-as-a-callback-method.md
- - name: Marshalling Data with COM Interop
- href: marshalling-data-with-com-interop.md
- items:
- - name: "How to: Create Wrappers Manually"
- href: how-to-create-wrappers-manually.md
- - name: "How to: Migrate Managed-Code DCOM to WCF"
- href: how-to-migrate-managed-code-dcom-to-wcf.md
-- name: "How to: Map HRESULTs and Exceptions"
- href: how-to-map-hresults-and-exceptions.md
-- name: "How to: Create COM Wrappers"
- href: how-to-create-com-wrappers.md
-- name: Type Equivalence and Embedded Interop Types
- href: type-equivalence-and-embedded-interop-types.md
-- name: "How to: Generate Primary Interop Assemblies Using Tlbimp.exe"
- href: how-to-generate-primary-interop-assemblies-using-tlbimp-exe.md
-- name: "How to: Register Primary Interop Assemblies"
- href: how-to-register-primary-interop-assemblies.md
-- name: Registration-Free COM Interop
- href: registration-free-com-interop.md
-- name: "How to: Configure .NET Framework-Based COM Components for Registration-Free Activation"
- href: configure-net-framework-based-com-components-for-reg.md
diff --git a/docs/framework/toc.yml b/docs/framework/toc.yml
index 9a8bd3707818b..1c4f4090a7bbd 100644
--- a/docs/framework/toc.yml
+++ b/docs/framework/toc.yml
@@ -160,7 +160,25 @@ items:
- name: Dynamic programming
href: reflection-and-codedom/
- name: Interoperate with unmanaged code
- href: interop/
+ items:
+ - name: Overview
+ href: interop/index.md
+ - name: Registration-free COM interop
+ href: interop/registration-free-com-interop.md
+ - name: "How to: Create COM wrappers"
+ href: interop/how-to-create-com-wrappers.md
+ - name: "How to: Create wrappers manually"
+ href: interop/how-to-create-wrappers-manually.md
+ - name: Marshal data with COM interop
+ href: interop/marshalling-data-with-com-interop.md
+ - name: "How to: Migrate managed-code DCOM to WCF"
+ href: interop/how-to-migrate-managed-code-dcom-to-wcf.md
+ - name: "How to: Generate primary interop assemblies using Tlbimp.exe"
+ href: interop/how-to-generate-primary-interop-assemblies-using-tlbimp-exe.md
+ - name: "How to: Register primary interop assemblies"
+ href: interop/how-to-register-primary-interop-assemblies.md
+ - name: "How to: Configure .NET Framework-based COM components for registration-free activation"
+ href: interop/configure-net-framework-based-com-components-for-reg.md
- name: Unmanaged API reference
href: unmanaged-api/
- name: Tools
diff --git a/docs/framework/tools/regasm-exe-assembly-registration-tool.md b/docs/framework/tools/regasm-exe-assembly-registration-tool.md
index 876043305f4a3..dc7433e900334 100644
--- a/docs/framework/tools/regasm-exe-assembly-registration-tool.md
+++ b/docs/framework/tools/regasm-exe-assembly-registration-tool.md
@@ -79,5 +79,5 @@ regasm myTest.dll /tlb:myTest.tlb
- [Tools](index.md)
- [Tlbexp.exe (Type Library Exporter)](tlbexp-exe-type-library-exporter.md)
- [Tlbimp.exe (Type Library Importer)](tlbimp-exe-type-library-importer.md)
-- [Registering Assemblies with COM](../interop/registering-assemblies-with-com.md)
+- [Registering Assemblies with COM](../../standard/native-interop/registering-assemblies-with-com.md)
- [Developer command-line shells](/visualstudio/ide/reference/command-prompt-powershell)
diff --git a/docs/framework/tools/tlbimp-exe-type-library-importer.md b/docs/framework/tools/tlbimp-exe-type-library-importer.md
index a790a3b2ff42e..488c76ce37ba6 100644
--- a/docs/framework/tools/tlbimp-exe-type-library-importer.md
+++ b/docs/framework/tools/tlbimp-exe-type-library-importer.md
@@ -127,7 +127,7 @@ void SomeMethod(out bool x);
- [Tools](index.md)
- [Tlbexp.exe (Type Library Exporter)](tlbexp-exe-type-library-exporter.md)
-- [Importing a Type Library as an Assembly](../interop/importing-a-type-library-as-an-assembly.md)
+- [Importing a Type Library as an Assembly](../../standard/native-interop/importing-a-type-library-as-an-assembly.md)
- [Type Library to Assembly Conversion Summary](/previous-versions/dotnet/netframework-4.0/k83zzh38(v=vs.100))
- [Ildasm.exe (IL Disassembler)](ildasm-exe-il-disassembler.md)
- [Sn.exe (Strong Name Tool)](sn-exe-strong-name-tool.md)
diff --git a/docs/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer.md b/docs/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer.md
index e9aec4fc28bc3..d5c49a6a131df 100644
--- a/docs/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer.md
+++ b/docs/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer.md
@@ -242,7 +242,7 @@ You can implement the `SERVICE_START_PENDING` and `SERVICE_STOP_PENDING` status
> [!NOTE]
> The Service Control Manager uses the `dwWaitHint` and `dwCheckpoint` members of the [SERVICE_STATUS structure](/windows/win32/api/winsvc/ns-winsvc-service_status) to determine how much time to wait for a Windows service to start or shut down. If your `OnStart` and `OnStop` methods run long, your service can request more time by calling `SetServiceStatus` again with an incremented `dwCheckPoint` value.
-3. In the `MyNewService` class, declare the [SetServiceStatus](/windows/desktop/api/winsvc/nf-winsvc-setservicestatus) function by using [platform invoke](../interop/consuming-unmanaged-dll-functions.md):
+3. In the `MyNewService` class, declare the [SetServiceStatus](/windows/desktop/api/winsvc/nf-winsvc-setservicestatus) function by using [platform invoke](../../standard/native-interop/consuming-unmanaged-dll-functions.md):
```csharp
[DllImport("advapi32.dll", SetLastError = true)]
diff --git a/docs/fsharp/language-reference/functions/external-functions.md b/docs/fsharp/language-reference/functions/external-functions.md
index 03171796df739..76b73351dc924 100644
--- a/docs/fsharp/language-reference/functions/external-functions.md
+++ b/docs/fsharp/language-reference/functions/external-functions.md
@@ -40,7 +40,7 @@ module InteropWithNative =
InteropWithNative.HelloWorld()
```
-Interoperability with native code is referred to as *platform invoke* and is a feature of the CLR. For more information, see [Interoperating with Unmanaged Code](../../../framework/interop/index.md). The information in that section is applicable to F#.
+Interoperability with native code is referred to as *platform invoke* and is a feature of the CLR. For more information, see [Interoperating with Unmanaged Code](../../../standard/native-interop/index.md). The information in that section is applicable to F#.
### Defining Parameters in External Functions
diff --git a/docs/fundamentals/code-analysis/quality-rules/ca1017.md b/docs/fundamentals/code-analysis/quality-rules/ca1017.md
index 4d569c72e9f5e..7b9f445f63d3c 100644
--- a/docs/fundamentals/code-analysis/quality-rules/ca1017.md
+++ b/docs/fundamentals/code-analysis/quality-rules/ca1017.md
@@ -58,5 +58,5 @@ namespace DesignLibrary {}
## See also
-- [Interoperating with Unmanaged Code](../../../framework/interop/index.md)
+- [Interoperating with Unmanaged Code](../../../standard/native-interop/index.md)
- [Qualifying .NET Types for Interoperation](../../../standard/native-interop/qualify-net-types-for-interoperation.md)
diff --git a/docs/fundamentals/code-analysis/quality-rules/ca1416.md b/docs/fundamentals/code-analysis/quality-rules/ca1416.md
index 395ea76c124b9..efa97ad713cd1 100644
--- a/docs/fundamentals/code-analysis/quality-rules/ca1416.md
+++ b/docs/fundamentals/code-analysis/quality-rules/ca1416.md
@@ -297,4 +297,4 @@ dotnet_code_quality.enable_platform_analyzer_on_pre_net5_target = true
- [Annotating platform-specific APIs and detecting its use](https://github.com/dotnet/designs/blob/main/accepted/2020/platform-checks/platform-checks.md)
- [Annotating APIs as unsupported on specific platforms](https://github.com/dotnet/designs/blob/main/accepted/2020/platform-exclusion/platform-exclusion.md)
- [Target Framework Names in .NET 5](https://github.com/dotnet/designs/blob/main/accepted/2020/net5/net5.md)
-- [Interoperability rules](../../../framework/interop/index.md)
+- [Interoperability rules](../../../standard/native-interop/index.md)
diff --git a/docs/fundamentals/code-analysis/quality-rules/ca1418.md b/docs/fundamentals/code-analysis/quality-rules/ca1418.md
index 30c8765187ad1..3d7d1b8a406ab 100644
--- a/docs/fundamentals/code-analysis/quality-rules/ca1418.md
+++ b/docs/fundamentals/code-analysis/quality-rules/ca1418.md
@@ -114,4 +114,4 @@ Using an unknown platform name or an invalid version is not recommended, so you
- [CA1416 Platform compatibility analyzer](ca1416.md)
- [Platform compatibility analyzer (conceptual)](../../../standard/analyzers/platform-compat-analyzer.md)
-- [Interoperability rules](../../../framework/interop/index.md)
+- [Interoperability rules](../../../standard/native-interop/index.md)
diff --git a/docs/fundamentals/code-analysis/quality-rules/ca1815.md b/docs/fundamentals/code-analysis/quality-rules/ca1815.md
index 93a1b42c18421..96cc751f0a6d3 100644
--- a/docs/fundamentals/code-analysis/quality-rules/ca1815.md
+++ b/docs/fundamentals/code-analysis/quality-rules/ca1815.md
@@ -30,7 +30,7 @@ By default, this rule only looks at externally visible types, but this is [confi
## Rule description
-For [non-blittable](../../../framework/interop/blittable-and-non-blittable-types.md) value types, the inherited implementation of uses the library to compare the contents of all fields. Reflection is computationally expensive, and comparing every field for equality might be unnecessary. If you expect users to compare or sort instances, or use them as hash table keys, your value type should implement . If your programming language supports operator overloading, you should also provide an implementation of the equality and inequality operators.
+For [non-blittable](../../../standard/native-interop/blittable-and-non-blittable-types.md) value types, the inherited implementation of uses the library to compare the contents of all fields. Reflection is computationally expensive, and comparing every field for equality might be unnecessary. If you expect users to compare or sort instances, or use them as hash table keys, your value type should implement . If your programming language supports operator overloading, you should also provide an implementation of the equality and inequality operators.
## How to fix violations
diff --git a/docs/fundamentals/code-analysis/quality-rules/ca1838.md b/docs/fundamentals/code-analysis/quality-rules/ca1838.md
index d5636dc3d37e4..901e80b2765b0 100644
--- a/docs/fundamentals/code-analysis/quality-rules/ca1838.md
+++ b/docs/fundamentals/code-analysis/quality-rules/ca1838.md
@@ -37,7 +37,7 @@ Marshalling of `StringBuilder` always creates a native buffer copy, resulting in
By default, `StringBuilder` is `In` and `Out`.
-For more information about marshalling strings, see [Default marshalling for strings](../../../framework/interop/default-marshalling-for-strings.md).
+For more information about marshalling strings, see [Default marshalling for strings](../../../standard/native-interop/default-marshalling-for-strings.md).
This rule is disabled by default, because it can require case-by-case analysis of whether the violation is of interest and potentially non-trivial refactoring to address the violation. Users can explicitly enable this rule by [configuring its severity](../configuration-options.md#severity-level).
@@ -168,7 +168,7 @@ For more information, see [How to suppress code analysis warnings](../suppress-w
## See also
-- [Default marshalling for strings](../../../framework/interop/default-marshalling-for-strings.md)
+- [Default marshalling for strings](../../../standard/native-interop/default-marshalling-for-strings.md)
- [Native interoperability best practices](../../../standard/native-interop/best-practices.md)
-
- [stackalloc](../../../csharp/language-reference/operators/stackalloc.md)
diff --git a/docs/navigate/advanced-programming/toc.yml b/docs/navigate/advanced-programming/toc.yml
index 4c65b9dd3ce77..05c3a6a869f0d 100644
--- a/docs/navigate/advanced-programming/toc.yml
+++ b/docs/navigate/advanced-programming/toc.yml
@@ -344,7 +344,7 @@ items:
- name: Overview
href: ../../standard/native-interop/index.md
displayName: Native interop
- - name: P/Invoke
+ - name: Consume unmanaged DLL functions (P/Invoke)
items:
- name: Overview
href: ../../standard/native-interop/pinvoke.md
@@ -355,6 +355,34 @@ items:
href: ../../standard/native-interop/native-library-loading.md
- name: Calling conventions
href: ../../standard/native-interop/calling-conventions.md
+ - name: Consume unmanaged DLL functions
+ items:
+ - name: Overview
+ href: ../../standard/native-interop/consuming-unmanaged-dll-functions.md
+ - name: Identify functions in DLLs
+ href: ../../standard/native-interop/identifying-functions-in-dlls.md
+ - name: Create a class to hold DLL functions
+ href: ../../standard/native-interop/creating-a-class-to-hold-dll-functions.md
+ - name: Create prototypes in managed code
+ items:
+ - name: Overview
+ href: ../../standard/native-interop/creating-prototypes-in-managed-code.md
+ - name: Specify an entry point
+ href: ../../standard/native-interop/specifying-an-entry-point.md
+ - name: Specify a character set
+ href: ../../standard/native-interop/specifying-a-character-set.md
+ - name: Platform invoke examples
+ href: ../../standard/native-interop/platform-invoke-examples.md
+ - name: Call a DLL function
+ items:
+ - name: Overview
+ href: ../../standard/native-interop/calling-a-dll-function.md
+ - name: Pass structures
+ href: ../../standard/native-interop/passing-structures.md
+ - name: Callback functions
+ href: ../../standard/native-interop/callback-functions.md
+ - name: "How to: Implement callback functions"
+ href: ../../standard/native-interop/how-to-implement-callback-functions.md
- name: Type marshalling
items:
- name: Overview
@@ -374,10 +402,40 @@ items:
href: ../../standard/native-interop/custom-marshaller-shapes.md
- name: "Tutorial: Use custom marshallers in source generation"
href: ../../standard/native-interop/tutorial-custom-marshaller.md
+ - name: Interop marshalling
+ items:
+ - name: Overview
+ href: ../../standard/native-interop/interop-marshalling.md
+ - name: Default marshalling behavior
+ items:
+ - name: Overview
+ href: ../../standard/native-interop/default-marshalling-behavior.md
+ - name: Blittable and non-blittable types
+ href: ../../standard/native-interop/blittable-and-non-blittable-types.md
+ - name: Copying and pinning
+ href: ../../standard/native-interop/copying-and-pinning.md
+ - name: Default marshalling for arrays
+ href: ../../standard/native-interop/default-marshalling-for-arrays.md
+ - name: Default marshalling for objects
+ href: ../../standard/native-interop/default-marshalling-for-objects.md
+ - name: Default marshalling for strings
+ href: ../../standard/native-interop/default-marshalling-for-strings.md
+ - name: Marshal data with platform invoke
+ items:
+ - name: Overview
+ href: ../../standard/native-interop/marshalling-data-with-platform-invoke.md
+ - name: Marshal strings
+ href: ../../standard/native-interop/marshalling-strings.md
+ - name: MsgBox sample
+ href: ../../standard/native-interop/msgbox-sample.md
+ - name: Marshal classes, structures, and unions
+ href: ../../standard/native-interop/marshalling-classes-structures-and-unions.md
+ - name: Marshal different types of arrays
+ href: ../../standard/native-interop/marshalling-different-types-of-arrays.md
+ - name: Marshal a delegate as a callback method
+ href: ../../standard/native-interop/marshalling-a-delegate-as-a-callback-method.md
- name: Interop best practices
href: ../../standard/native-interop/best-practices.md
- - name: Expose .NET components to COM
- href: ../../core/native-interop/expose-components-to-com.md
- name: Host .NET from native code
href: ../../core/tutorials/netcore-hosting.md
- name: COM interop
@@ -398,8 +456,42 @@ items:
href: ../../standard/native-interop/tutorial-comwrappers.md
- name: Source generation
href: ../../standard/native-interop/comwrappers-source-generation.md
+ - name: Expose COM components to .NET
+ items:
+ - name: Overview
+ href: ../../standard/native-interop/exposing-com-components.md
+ - name: Import a type library as an assembly
+ href: ../../standard/native-interop/importing-a-type-library-as-an-assembly.md
+ - name: "How to: Add references to type libraries"
+ href: ../../standard/native-interop/how-to-add-references-to-type-libraries.md
+ - name: "How to: Generate interop assemblies from type libraries"
+ href: ../../standard/native-interop/how-to-generate-interop-assemblies-from-type-libraries.md
+ - name: Compile an interop project
+ href: ../../standard/native-interop/compiling-an-interop-project.md
+ - name: Deploy an interop application
+ href: ../../standard/native-interop/deploying-an-interop-application.md
+ - name: "Sample: .NET client and COM server"
+ href: ../../standard/native-interop/com-interop-sample-net-client-and-com-server.md
+ - name: Expose .NET components to COM
+ items:
+ - name: Overview
+ href: ../../standard/native-interop/exposing-dotnet-components-to-com.md
+ - name: Package an assembly for COM
+ href: ../../standard/native-interop/packaging-an-assembly-for-com.md
+ - name: Register assemblies with COM
+ href: ../../standard/native-interop/registering-assemblies-with-com.md
+ - name: "How to: Reference .NET types from COM"
+ href: ../../standard/native-interop/how-to-reference-net-types-from-com.md
+ - name: "Sample: COM client and .NET server"
+ href: ../../standard/native-interop/com-interop-sample-com-client-and-net-server.md
+ - name: Expose .NET Core components to COM
+ href: ../../core/native-interop/expose-components-to-com.md
- name: Qualify .NET types for COM interop
href: ../../standard/native-interop/qualify-net-types-for-interoperation.md
+ - name: Type equivalence and embedded interop types
+ href: ../../standard/native-interop/type-equivalence-and-embedded-interop-types.md
+ - name: "How to: Map HRESULTs and exceptions"
+ href: ../../standard/native-interop/how-to-map-hresults-and-exceptions.md
- name: Apply interop attributes
href: ../../standard/native-interop/apply-interop-attributes.md
- name: HRESULT and PreserveSig
diff --git a/docs/standard/assembly/create.md b/docs/standard/assembly/create.md
index 6a123a3c0e74e..0ba1916d25edb 100644
--- a/docs/standard/assembly/create.md
+++ b/docs/standard/assembly/create.md
@@ -37,7 +37,7 @@ You have several options when grouping code modules and resources into assemblie
Group modules containing types whose visibility should be restricted to the same assembly.
-There are special considerations when making common language runtime assemblies available to unmanaged COM applications. For more information about working with unmanaged code, see [Expose .NET Framework components to COM](../../framework/interop/exposing-dotnet-components-to-com.md).
+There are special considerations when making common language runtime assemblies available to unmanaged COM applications. For more information about working with unmanaged code, see [Expose .NET Framework components to COM](../../standard/native-interop/exposing-dotnet-components-to-com.md).
## See also
diff --git a/docs/standard/exceptions/handling-com-interop-exceptions.md b/docs/standard/exceptions/handling-com-interop-exceptions.md
index 8b1fc3341493e..d4bd1b0513a4e 100644
--- a/docs/standard/exceptions/handling-com-interop-exceptions.md
+++ b/docs/standard/exceptions/handling-com-interop-exceptions.md
@@ -22,7 +22,7 @@ Managed and unmanaged code can work together to handle exceptions. If a method t
When an error is passed from COM to managed code, the runtime populates the exception object with error information. COM objects that support IErrorInfo and return HRESULTS provide this information to managed code exceptions. For example, the runtime maps the Description from the COM error to the exception's property. If the HRESULT provides no additional error information, the runtime fills many of the exception's properties with default values.
- If a method fails in unmanaged code, an exception can be passed to a managed code segment. The topic [HRESULTS and Exceptions](../../framework/interop/how-to-map-hresults-and-exceptions.md) contains a table showing how HRESULTS map to runtime exception objects.
+ If a method fails in unmanaged code, an exception can be passed to a managed code segment. The topic [HRESULTS and Exceptions](../../standard/native-interop/how-to-map-hresults-and-exceptions.md) contains a table showing how HRESULTS map to runtime exception objects.
## See also
diff --git a/docs/standard/managed-execution-process.md b/docs/standard/managed-execution-process.md
index 2805b54af915c..c01a389f93d25 100644
--- a/docs/standard/managed-execution-process.md
+++ b/docs/standard/managed-execution-process.md
@@ -85,7 +85,7 @@ The managed execution process includes the following steps, which are discussed
- [Metadata and Self-Describing Components](metadata-and-self-describing-components.md)
- [Ilasm.exe (IL Assembler)](../framework/tools/ilasm-exe-il-assembler.md)
- [Security](security/index.md)
-- [Interoperating with Unmanaged Code](../framework/interop/index.md)
+- [Interoperating with Unmanaged Code](../standard/native-interop/index.md)
- [Deployment](../framework/deployment/net-framework-applications.md)
- [Assemblies in .NET](assembly/index.md)
- [Application Domains](../framework/app-domains/application-domains.md)
diff --git a/docs/standard/native-interop/apply-interop-attributes.md b/docs/standard/native-interop/apply-interop-attributes.md
index 6ec63fa324b2e..2ebf1b39998be 100644
--- a/docs/standard/native-interop/apply-interop-attributes.md
+++ b/docs/standard/native-interop/apply-interop-attributes.md
@@ -2,7 +2,7 @@
title: "Applying Interop Attributes"
description: This article summarizes COM interop attributes of the System.Runtime.InteropServices namespace, including design-time and conversion-tool attributes.
ms.date: "03/30/2017"
-helpviewer_keywords:
+helpviewer_keywords:
- "design-time attributes"
- ".NET, exposing components to COM"
- "attributes [.NET], design-time functionality"
@@ -13,61 +13,61 @@ helpviewer_keywords:
- "interoperation with unmanaged code, exposing .NET components"
- "COM interop, exposing COM components"
- "COM interop, applying attributes"
-ms.assetid: b6014613-641c-4912-9e2f-83a99210a037
---
-# Applying Interop Attributes
-The namespace provides three categories of interop-specific attributes: those applied by you at design time, those applied by COM interop tools and APIs during the conversion process, and those applied either by you or COM interop.
-
- If you are unfamiliar with the task of applying attributes to managed code, see [Extending Metadata Using Attributes](../attributes/index.md). Like other custom attributes, you can apply interop-specific attributes to types, methods, properties, parameters, fields, and other members.
-
-## Design-Time Attributes
+# Apply interop attributes
- You can adjust the outcome of the conversion process performed by COM interop tools and APIs by using design-time attributes. The following table describes the attributes that you can apply to your managed source code. COM interop tools, on occasion, might also apply the attributes described in this table.
-
-|Attribute|Description|
-|---------------|-----------------|
-||Specifies whether the type should be marshalled using the Automation marshaller or a custom proxy and stub.|
-||Controls the type of interface generated for a class.|
-||Identifies the CLSID of the original coclass imported from a type library.
COM interop tools typically apply this attribute.|
-||Indicates that a coclass or interface definition was imported from a COM type library. The runtime uses this flag to know how to activate and marshal the type. This attribute prohibits the type from being exported back to a type library.
COM interop tools typically apply this attribute.|
-||Indicates that a method should be called when the assembly is registered for use from COM, so that user-written code can be executed during the registration process.|
-||Identifies interfaces that are sources of events for the class.
COM interop tools can apply this attribute.|
-||Indicates that a method should be called when the assembly is unregistered from COM, so that user-written code can execute during the process.|
-||Renders types invisible to COM when the attribute value equals **false**. This attribute can be applied to an individual type or to an entire assembly to control COM visibility. By default, all managed, public types are visible; the attribute is not needed to make them visible.|
+The namespace provides three categories of interop-specific attributes: those applied by you at design time, those applied by COM interop tools and APIs during the conversion process, and those applied either by you or COM interop.
+
+ If you are unfamiliar with the task of applying attributes to managed code, see [Extending Metadata Using Attributes](../attributes/index.md). Like other custom attributes, you can apply interop-specific attributes to types, methods, properties, parameters, fields, and other members.
+
+## Design-Time Attributes
+
+ You can adjust the outcome of the conversion process performed by COM interop tools and APIs by using design-time attributes. The following table describes the attributes that you can apply to your managed source code. COM interop tools, on occasion, might also apply the attributes described in this table.
+
+|Attribute|Description|
+|---------------|-----------------|
+||Specifies whether the type should be marshalled using the Automation marshaller or a custom proxy and stub.|
+||Controls the type of interface generated for a class.|
+||Identifies the CLSID of the original coclass imported from a type library.
COM interop tools typically apply this attribute.|
+||Indicates that a coclass or interface definition was imported from a COM type library. The runtime uses this flag to know how to activate and marshal the type. This attribute prohibits the type from being exported back to a type library.
COM interop tools typically apply this attribute.|
+||Indicates that a method should be called when the assembly is registered for use from COM, so that user-written code can be executed during the registration process.|
+||Identifies interfaces that are sources of events for the class.
COM interop tools can apply this attribute.|
+||Indicates that a method should be called when the assembly is unregistered from COM, so that user-written code can execute during the process.|
+||Renders types invisible to COM when the attribute value equals **false**. This attribute can be applied to an individual type or to an entire assembly to control COM visibility. By default, all managed, public types are visible; the attribute is not needed to make them visible.|
||Specifies the COM dispatch identifier (DISPID) of a method or field. This attribute contains the DISPID for the method, field, or property it describes.
COM interop tools can apply this attribute.|
||Indicates the default interface for a COM class implemented in .NET.
COM interop tools can apply this attribute.|
-||Indicates the physical position of each field within a class when used with the **StructLayoutAttribute**, and the **LayoutKind** is set to Explicit.|
-||Specifies the globally unique identifier (GUID) of a class, interface, or an entire type library. The string passed to the attribute must be a format that is an acceptable constructor argument for the type **System.Guid**.
COM interop tools can apply this attribute.|
-||Indicates which **IDispatch** interface implementation the common language runtime uses when exposing dual interfaces and dispinterfaces to COM.|
-||Indicates that data should be marshalled in to the caller. Can be used to attribute parameters.|
-||Controls how a managed interface is exposed to COM clients (Dual, IUnknown-derived, or IDispatch only).
COM interop tools can apply this attribute.|
-||Indicates that an unmanaged method signature expects an LCID parameter.
COM interop tools can apply this attribute.|
-||Indicates how the data in fields or parameters should be marshalled between managed and unmanaged code. The attribute is always optional because each data type has default marshalling behavior.
COM interop tools can apply this attribute.|
-||Indicates that a parameter is optional.
COM interop tools can apply this attribute.|
-||Indicates that the data in a field or parameter must be marshalled from a called object back to its caller.|
-||Suppresses the HRESULT or retval signature transformation that normally takes place during interoperation calls. The attribute affects marshalling as well as type library exporting.
COM interop tools can apply this attribute.|
-||Specifies the ProgID of a .NET class. Can be used to attribute classes.|
+||Indicates the physical position of each field within a class when used with the **StructLayoutAttribute**, and the **LayoutKind** is set to Explicit.|
+||Specifies the globally unique identifier (GUID) of a class, interface, or an entire type library. The string passed to the attribute must be a format that is an acceptable constructor argument for the type **System.Guid**.
COM interop tools can apply this attribute.|
+||Indicates which **IDispatch** interface implementation the common language runtime uses when exposing dual interfaces and dispinterfaces to COM.|
+||Indicates that data should be marshalled in to the caller. Can be used to attribute parameters.|
+||Controls how a managed interface is exposed to COM clients (Dual, IUnknown-derived, or IDispatch only).
COM interop tools can apply this attribute.|
+||Indicates that an unmanaged method signature expects an LCID parameter.
COM interop tools can apply this attribute.|
+||Indicates how the data in fields or parameters should be marshalled between managed and unmanaged code. The attribute is always optional because each data type has default marshalling behavior.
COM interop tools can apply this attribute.|
+||Indicates that a parameter is optional.
COM interop tools can apply this attribute.|
+||Indicates that the data in a field or parameter must be marshalled from a called object back to its caller.|
+||Suppresses the HRESULT or retval signature transformation that normally takes place during interoperation calls. The attribute affects marshalling as well as type library exporting.
COM interop tools can apply this attribute.|
+||Specifies the ProgID of a .NET class. Can be used to attribute classes.|
||Controls the physical layout of the fields of a class. For managed fixed-size buffers, see [Fixed-size buffers and inline arrays](customize-struct-marshalling.md#fixed-size-buffers-and-inline-arrays) and .
COM interop tools can apply this attribute.|
-
-## Conversion-Tool Attributes
- The following table describes attributes that COM interop tools apply during the conversion process. You do not apply these attributes at design time.
-
-|Attribute|Description|
-|---------------|-----------------|
-||Indicates the COM alias for a parameter or field type. Can be used to attribute parameters, fields, or return values.|
-||Indicates that information about a class or interface was lost when it was imported from a type library to an assembly.|
-||Identifies the source interface and the class that implements the methods of the event interface.|
-||Indicates that the assembly was originally imported from a COM type library. This attribute contains the type library definition of the original type library.|
-||Contains the **FUNCFLAGS** that were originally imported for this function from the COM type library.|
-||Contains the **TYPEFLAGS** that were originally imported for this type from the COM type library.|
-||Contains the **VARFLAGS** that were originally imported for this variable from the COM type library.|
-
+## Conversion-Tool Attributes
+
+ The following table describes attributes that COM interop tools apply during the conversion process. You do not apply these attributes at design time.
+
+|Attribute|Description|
+|---------------|-----------------|
+||Indicates the COM alias for a parameter or field type. Can be used to attribute parameters, fields, or return values.|
+||Indicates that information about a class or interface was lost when it was imported from a type library to an assembly.|
+||Identifies the source interface and the class that implements the methods of the event interface.|
+||Indicates that the assembly was originally imported from a COM type library. This attribute contains the type library definition of the original type library.|
+||Contains the **FUNCFLAGS** that were originally imported for this function from the COM type library.|
+||Contains the **TYPEFLAGS** that were originally imported for this type from the COM type library.|
+||Contains the **VARFLAGS** that were originally imported for this variable from the COM type library.|
+
## See also
-
-- [Exposing .NET Framework Components to COM](../../framework/interop/exposing-dotnet-components-to-com.md)
+- [Exposing .NET Framework Components to COM](exposing-dotnet-components-to-com.md)
- [Attributes](../attributes/index.md)
- [Qualifying .NET Types for Interoperation](qualify-net-types-for-interoperation.md)
-- [Packaging a .NET Framework Assembly for COM](../../framework/interop/packaging-an-assembly-for-com.md)
+- [Packaging a .NET Framework Assembly for COM](packaging-an-assembly-for-com.md)
diff --git a/docs/standard/native-interop/best-practices.md b/docs/standard/native-interop/best-practices.md
index cd407839455cd..4f1a318451964 100644
--- a/docs/standard/native-interop/best-practices.md
+++ b/docs/standard/native-interop/best-practices.md
@@ -73,7 +73,7 @@ The other issue with `StringBuilder` is that it always copies the return buffer
If you *do* use `StringBuilder`, one last gotcha is that the capacity does **not** include a hidden null, which is always accounted for in interop. It's common for people to get this wrong as most APIs want the size of the buffer *including* the null. This can result in wasted/unnecessary allocations. Additionally, this gotcha prevents the runtime from optimizing `StringBuilder` marshalling to minimize copies.
-For more information on string marshalling, see [Default Marshalling for Strings](../../framework/interop/default-marshalling-for-strings.md) and [Customizing string marshalling](customize-parameter-marshalling.md#customizing-string-parameters).
+For more information on string marshalling, see [Default Marshalling for Strings](default-marshalling-for-strings.md) and [Customizing string marshalling](customize-parameter-marshalling.md#customizing-string-parameters).
> **Windows Specific**
> For `[Out]` strings the CLR will use `CoTaskMemFree` by default to free strings or `SysStringFree` for strings that are marked
@@ -162,7 +162,7 @@ These rules differ from the built-in system primarily in situations where `bool`
For more information, see:
-- [Blittable and Non-Blittable Types](../../framework/interop/blittable-and-non-blittable-types.md)
+- [Blittable and Non-Blittable Types](blittable-and-non-blittable-types.md)
- [Type Marshalling](type-marshalling.md)
## Keeping managed objects alive
diff --git a/docs/framework/interop/blittable-and-non-blittable-types.md b/docs/standard/native-interop/blittable-and-non-blittable-types.md
similarity index 98%
rename from docs/framework/interop/blittable-and-non-blittable-types.md
rename to docs/standard/native-interop/blittable-and-non-blittable-types.md
index e9075328b0f1d..bdd80710f9f44 100644
--- a/docs/framework/interop/blittable-and-non-blittable-types.md
+++ b/docs/standard/native-interop/blittable-and-non-blittable-types.md
@@ -1,11 +1,11 @@
---
title: "Blittable and Non-Blittable Types"
description: Learn about blittable and nonblittable types. Blittable data types are commonly represented in managed and unmanaged memory and don't need special handling.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "interop marshalling, blittable types"
- "blittable types, interop marshalling"
-ms.assetid: d03b050e-2916-49a0-99ba-f19316e5c1b3
---
# Blittable and Non-Blittable Types
diff --git a/docs/framework/interop/callback-functions.md b/docs/standard/native-interop/callback-functions.md
similarity index 96%
rename from docs/framework/interop/callback-functions.md
rename to docs/standard/native-interop/callback-functions.md
index 1fc06b7633c9a..4df2aaf4b6e93 100644
--- a/docs/framework/interop/callback-functions.md
+++ b/docs/standard/native-interop/callback-functions.md
@@ -1,11 +1,11 @@
---
title: "Callback Functions"
description: Read about callback functions, which are code with a managed application that helps an unmanaged DLL function complete a task.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "callback function"
- "platform invoke, calling unmanaged functions"
-ms.assetid: c0aa8533-3b3b-42e8-9f60-84919793098c
---
# Callback Functions
diff --git a/docs/framework/interop/calling-a-dll-function.md b/docs/standard/native-interop/calling-a-dll-function.md
similarity index 72%
rename from docs/framework/interop/calling-a-dll-function.md
rename to docs/standard/native-interop/calling-a-dll-function.md
index 857170c2e3153..0ad9fb284eb31 100644
--- a/docs/framework/interop/calling-a-dll-function.md
+++ b/docs/standard/native-interop/calling-a-dll-function.md
@@ -1,37 +1,37 @@
---
title: "Calling a DLL Function"
description: Review issues about calling a DLL function that can seem confusing. The function calling process differs depending on if the return type is blittable.
-ms.date: "03/30/2017"
-helpviewer_keywords:
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
- "unmanaged functions, calling"
- "unmanaged functions"
- "COM interop, platform invoke"
- "platform invoke, calling unmanaged functions"
- "interoperation with unmanaged code, platform invoke"
- "DLL functions"
-ms.assetid: 113646de-7ea0-4f0e-8df0-c46dab3e8733
---
# Calling a DLL Function
-Although calling unmanaged DLL functions is nearly identical to calling other managed code, there are differences that can make DLL functions seem confusing at first. This section introduces topics that describe some of the unusual calling-related issues.
-
- Structures that are returned from platform invoke calls must be data types that have the same representation in managed and unmanaged code. Such types are called *blittable types* because they do not require conversion (see [Blittable and Non-Blittable Types](blittable-and-non-blittable-types.md)). To call a function that has a non-blittable structure as its return type, you can define a blittable helper type of the same size as the non-blittable type and convert the data after the function returns.
-
-## In This Section
-
- [Passing Structures](passing-structures.md)
- Identifies the issues of passing data structures with a predefined layout.
-
- [Callback Functions](callback-functions.md)
- Provides basic information about callback functions.
-
- [How to: Implement Callback Functions](how-to-implement-callback-functions.md)
- Describes how to implement callback functions in managed code.
-
-## Related Sections
-
- [Consuming Unmanaged DLL Functions](consuming-unmanaged-dll-functions.md)
- Describes how to call unmanaged DLL functions using platform invoke.
-
- [Marshalling Data with Platform Invoke](marshalling-data-with-platform-invoke.md)
+Although calling unmanaged DLL functions is nearly identical to calling other managed code, there are differences that can make DLL functions seem confusing at first. This section introduces topics that describe some of the unusual calling-related issues.
+
+ Structures that are returned from platform invoke calls must be data types that have the same representation in managed and unmanaged code. Such types are called *blittable types* because they do not require conversion (see [Blittable and Non-Blittable Types](blittable-and-non-blittable-types.md)). To call a function that has a non-blittable structure as its return type, you can define a blittable helper type of the same size as the non-blittable type and convert the data after the function returns.
+
+## In This Section
+
+ [Passing Structures](passing-structures.md)
+ Identifies the issues of passing data structures with a predefined layout.
+
+ [Callback Functions](callback-functions.md)
+ Provides basic information about callback functions.
+
+ [How to: Implement Callback Functions](how-to-implement-callback-functions.md)
+ Describes how to implement callback functions in managed code.
+
+## Related Sections
+
+ [Consuming Unmanaged DLL Functions](consuming-unmanaged-dll-functions.md)
+ Describes how to call unmanaged DLL functions using platform invoke.
+
+ [Marshalling Data with Platform Invoke](marshalling-data-with-platform-invoke.md)
Describes how to declare method parameters and pass arguments to functions exported by unmanaged libraries.
diff --git a/docs/standard/native-interop/com-callable-wrapper.md b/docs/standard/native-interop/com-callable-wrapper.md
index a3037bfb10243..32594bdca07a1 100644
--- a/docs/standard/native-interop/com-callable-wrapper.md
+++ b/docs/standard/native-interop/com-callable-wrapper.md
@@ -12,7 +12,6 @@ helpviewer_keywords:
- "callable wrappers"
- "interoperation with unmanaged code, COM wrappers"
- "COM callable wrappers"
-ms.assetid: d04be3b5-27b9-4f5b-8469-a44149fabf78
---
# COM Callable Wrapper
@@ -192,7 +191,7 @@ If your application requires early-bound calls to COM event interface methods, y
-
- [COM Wrappers](com-wrappers.md)
-- [Exposing .NET Framework Components to COM](../../framework/interop/exposing-dotnet-components-to-com.md)
+- [Exposing .NET Framework Components to COM](exposing-dotnet-components-to-com.md)
- [Exposing .NET Core Components to COM](../../core/native-interop/expose-components-to-com.md)
- [Qualifying .NET Types for Interoperation](qualify-net-types-for-interoperation.md)
- [Runtime Callable Wrapper](runtime-callable-wrapper.md)
diff --git a/docs/framework/interop/com-interop-sample-com-client-and-net-server.md b/docs/standard/native-interop/com-interop-sample-com-client-and-net-server.md
similarity index 96%
rename from docs/framework/interop/com-interop-sample-com-client-and-net-server.md
rename to docs/standard/native-interop/com-interop-sample-com-client-and-net-server.md
index f1a497f7fd3f9..c4d49e176a928 100644
--- a/docs/framework/interop/com-interop-sample-com-client-and-net-server.md
+++ b/docs/standard/native-interop/com-interop-sample-com-client-and-net-server.md
@@ -1,22 +1,22 @@
---
-title: "COM Interop Sample: COM Client and .NET Server"
+title: "COM interop sample: COM client and .NET server"
description: Read a code sample that shows the interoperation of a COM client and a .NET server that performs mortgage calculations.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
helpviewer_keywords:
- "interoperation with unmanaged code, samples"
- "COM interop, samples"
-ms.assetid: a219cb2c-9fa2-4c90-9b26-939e0788f178
---
-# COM Interop Sample: COM Client and .NET Server
+# COM interop sample: COM client and .NET server
-This sample demonstrates the interoperation of a [COM Client](#cpconcominteropsamplecomclientnetserveranchor1) and a [.NET Server](#cpconcominteropsamplecomclientnetserveranchor2) that performs mortgage calculations. In this example, the client creates and calls an instance of the managed `Loan` class, passes four arguments (one of those four being equal to zero) to the instance, and displays the computations. Code examples from this sample appear throughout this section.
+This sample demonstrates the interoperation of a [COM client](#cpconcominteropsamplecomclientnetserveranchor1) and a [.NET server](#cpconcominteropsamplecomclientnetserveranchor2) that performs mortgage calculations. In this example, the client creates and calls an instance of the managed `Loan` class, passes four arguments (one of those four being equal to zero) to the instance, and displays the computations. Code examples from this sample appear throughout this section.
-## COM Client
+## COM client
```cpp
// ConLoan.cpp : Defines the entry point for the console application.
@@ -84,7 +84,7 @@ int main(int argc, char* argv[])
-## .NET Server
+## .NET server
```vb
Imports System
@@ -387,4 +387,4 @@ namespace LoanLib {
## See also
-- [Exposing .NET Framework Components to COM](exposing-dotnet-components-to-com.md)
+- [Expose .NET components to COM](exposing-dotnet-components-to-com.md)
diff --git a/docs/framework/interop/com-interop-sample-net-client-and-com-server.md b/docs/standard/native-interop/com-interop-sample-net-client-and-com-server.md
similarity index 96%
rename from docs/framework/interop/com-interop-sample-net-client-and-com-server.md
rename to docs/standard/native-interop/com-interop-sample-net-client-and-com-server.md
index 7e97de218dc64..57a1b39328cdc 100644
--- a/docs/framework/interop/com-interop-sample-net-client-and-com-server.md
+++ b/docs/standard/native-interop/com-interop-sample-net-client-and-com-server.md
@@ -1,7 +1,8 @@
---
-title: "COM Interop Sample: .NET Client and COM Server"
+title: "COM interop sample: .NET client and COM server"
description: Read a code sample that shows how a .NET client accesses a COM server to create a COM coclass instance and call class members to perform mortgage calculations.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
@@ -9,9 +10,8 @@ dev_langs:
helpviewer_keywords:
- "interoperation with unmanaged code, samples"
- "COM interop, samples"
-ms.assetid: a3f752bb-8945-4e1b-8163-71def6e9f137
---
-# COM Interop Sample: .NET Client and COM Server
+# COM interop sample: .NET client and COM server
This sample demonstrates how a [.NET client](#cpconcominteropsamplenetclientcomserveranchor1), built to access a [COM server](#cpconcominteropsamplenetclientcomserveranchor2), creates an instance of a COM coclass and calls class members to perform mortgage calculations.
@@ -19,7 +19,7 @@ This sample demonstrates how a [.NET client](#cpconcominteropsamplenetclientcoms
-## .NET Client
+## .NET client
```vb
Imports System
@@ -297,4 +297,4 @@ static double Round(double value, short digits)
## See also
-- [Exposing COM Components to the .NET Framework](exposing-com-components.md)
+- [Expose COM components to .NET](exposing-com-components.md)
diff --git a/docs/standard/native-interop/com-wrappers.md b/docs/standard/native-interop/com-wrappers.md
index af0ddeaa470be..23476154be416 100644
--- a/docs/standard/native-interop/com-wrappers.md
+++ b/docs/standard/native-interop/com-wrappers.md
@@ -9,7 +9,6 @@ helpviewer_keywords:
- "COM, wrappers"
- "interoperation with unmanaged code, COM wrappers"
- "COM callable wrappers"
-ms.assetid: e56c485b-6b67-4345-8e66-fd21835a6092
---
# COM Wrappers
diff --git a/docs/standard/native-interop/cominterop.md b/docs/standard/native-interop/cominterop.md
index 2ffe947cb7993..9b7cbc8293724 100644
--- a/docs/standard/native-interop/cominterop.md
+++ b/docs/standard/native-interop/cominterop.md
@@ -1,16 +1,16 @@
---
title: COM Interop in .NET
description: Learn how to interoperate with COM libraries in .NET.
-ms.date: 07/11/2019
+ms.date: 07/08/2026
---
-# COM Interop in .NET
+# COM interop in .NET
-The Component Object Model (COM) lets an object expose its functionality to other components and to host applications on Windows platforms. To help enable users to interoperate with their existing code bases, .NET Framework has always provided strong support for interoperating with COM libraries. In .NET Core 3.0, a large portion of this support has been added to .NET Core on Windows. The documentation here explains how the common COM interop technologies work and how you can utilize them to interoperate with your existing COM libraries.
+The Component Object Model (COM) lets an object expose its functionality to other components and to host applications on Windows platforms. To help enable users to interoperate with their existing code bases, .NET Framework has always provided strong support for interoperating with COM libraries. A large portion of this support has been added to modern .NET (on Windows only). The documentation here explains how the common COM interop technologies work and how you can utilize them to interoperate with your existing COM libraries.
## Built-in and source-generated COM interop
-COM interop functionality can be achieved through a built-in system in the .NET runtime or through implementing the [ComWrappers API](./tutorial-comwrappers.md) (introduced in .NET 6). Starting in .NET 8, you can use the [COM source generator](./comwrappers-source-generation.md) to automatically implement the `ComWrappers` API for `IUnknown`-based interfaces.
+COM interop functionality can be achieved through a built-in system in the .NET runtime or through implementing the [ComWrappers API](./tutorial-comwrappers.md) (introduced in .NET 6). You can use the [COM source generator](./comwrappers-source-generation.md) to automatically implement the `ComWrappers` API for `IUnknown`-based interfaces.
- [COM Wrappers](./com-wrappers.md)
- [COM Callable Wrappers](./com-callable-wrapper.md)
diff --git a/docs/framework/interop/compiling-an-interop-project.md b/docs/standard/native-interop/compiling-an-interop-project.md
similarity index 70%
rename from docs/framework/interop/compiling-an-interop-project.md
rename to docs/standard/native-interop/compiling-an-interop-project.md
index dfd2f4186deff..62a75a35d896c 100644
--- a/docs/framework/interop/compiling-an-interop-project.md
+++ b/docs/standard/native-interop/compiling-an-interop-project.md
@@ -1,25 +1,27 @@
---
-title: "Compiling an Interop Project"
+title: "Compile an interop project"
description: Review how to compile a COM interop project, which are compiled like managed projects if they reference one or more assemblies containing imported COM types.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "interoperation with unmanaged code, compiling"
- "COM interop, compiling"
- - "exposing COM components to .NET Framework"
+ - "exposing COM components to .NET"
- "compiling interop projects"
- "interoperation with unmanaged code, exposing COM components"
- "COM interop, exposing COM components"
-ms.assetid: 6fcf6588-5e25-41af-b4ae-780974f2c3df
---
-# Compiling an Interop Project
+# Compile an interop project
+
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses legacy interop assemblies and primary interop assemblies. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
COM interop projects that reference one or more assemblies containing imported COM types are compiled like any other managed project. You can reference interop assemblies in a development environment such as Visual Studio, or you can reference them when you use a command-line compiler. In either case, to compile properly, the interop assembly must be in the same directory as the other project files.
There are two ways to reference interop assemblies:
-- Embedded interop types: Beginning with the .NET Framework 4 and Visual Studio 2010, you can instruct the compiler to embed type information from an interop assembly into your executable. This is the recommended technique.
-
-- Deploying interop assemblies: You can create a standard reference to an interop assembly. In this case, the interop assembly must be deployed with your application.
+- Embedded interop types: Instruct the compiler to embed type information from an interop assembly into your executable. This is the recommended technique.
+- Deploying interop assemblies: Create a standard reference to an interop assembly. In this case, the interop assembly must be deployed with your application.
The differences between these two techniques are discussed in greater detail in [Using COM Types in Managed Code](/previous-versions/dotnet/netframework-4.0/3y76b69k(v=vs.100)).
@@ -34,8 +36,8 @@ COM interop projects that reference one or more assemblies containing imported C
## See also
-- [Exposing COM Components to the .NET Framework](exposing-com-components.md)
+- [Expose COM components to .NET](exposing-com-components.md)
- [Language Independence and Language-Independent Components](../../standard/language-independence.md)
- [Using COM Types in Managed Code](/previous-versions/dotnet/netframework-4.0/3y76b69k(v=vs.100))
- [Walkthrough: Embedding Types from Managed Assemblies in Visual Studio](../../standard/assembly/embed-types-visual-studio.md)
-- [Importing a Type Library as an Assembly](importing-a-type-library-as-an-assembly.md)
+- [Import a type library as an assembly](importing-a-type-library-as-an-assembly.md)
diff --git a/docs/framework/interop/consuming-unmanaged-dll-functions.md b/docs/standard/native-interop/consuming-unmanaged-dll-functions.md
similarity index 98%
rename from docs/framework/interop/consuming-unmanaged-dll-functions.md
rename to docs/standard/native-interop/consuming-unmanaged-dll-functions.md
index 29e6bca2f5194..b17aa039b95e9 100644
--- a/docs/framework/interop/consuming-unmanaged-dll-functions.md
+++ b/docs/standard/native-interop/consuming-unmanaged-dll-functions.md
@@ -1,7 +1,8 @@
---
title: "Consuming Unmanaged DLL Functions"
description: Consume unmanaged DLL functions by using the platform invoke service, which lets managed code call unmanaged functions implemented in DLL libraries.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "unmanaged functions, calling"
- "COM interop, DLL functions"
@@ -13,7 +14,6 @@ helpviewer_keywords:
- "interoperation with unmanaged code, platform invoke"
- "platform invoke"
- "DLL functions"
-ms.assetid: eca7606e-ebfb-4f47-b8d9-289903fdc045
---
# Consuming Unmanaged DLL Functions
diff --git a/docs/framework/interop/copying-and-pinning.md b/docs/standard/native-interop/copying-and-pinning.md
similarity index 99%
rename from docs/framework/interop/copying-and-pinning.md
rename to docs/standard/native-interop/copying-and-pinning.md
index 3c275cced2e5a..90753510d5d62 100644
--- a/docs/framework/interop/copying-and-pinning.md
+++ b/docs/standard/native-interop/copying-and-pinning.md
@@ -1,14 +1,13 @@
---
title: "Copying and Pinning"
description: Review how the interop marshaller can copy or pin data that's being marshalled. Copying data places a copy of data from one memory location into another location.
-ms.date: 03/20/2026
+ms.date: 07/08/2026
ai-usage: ai-assisted
helpviewer_keywords:
- "pinning, interop marshalling"
- "copying, interop marshalling"
- "interop marshalling, copying"
- "interop marshalling, pinning"
-ms.assetid: 0059f576-e460-4e70-b257-668870e420b8
---
# Copying and Pinning
diff --git a/docs/framework/interop/creating-a-class-to-hold-dll-functions.md b/docs/standard/native-interop/creating-a-class-to-hold-dll-functions.md
similarity index 83%
rename from docs/framework/interop/creating-a-class-to-hold-dll-functions.md
rename to docs/standard/native-interop/creating-a-class-to-hold-dll-functions.md
index dece1592efd4c..43efc6ed8c833 100644
--- a/docs/framework/interop/creating-a-class-to-hold-dll-functions.md
+++ b/docs/standard/native-interop/creating-a-class-to-hold-dll-functions.md
@@ -1,8 +1,9 @@
---
title: "Creating a Class to Hold DLL Functions"
description: Create a managed class wrapper in .NET to hold DLL functions, which helps to encapsulate platform functionality.
-ms.date: "03/30/2017"
-helpviewer_keywords:
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
- "COM interop, DLL functions"
- "unmanaged functions"
- "COM interop, platform invoke"
@@ -10,26 +11,25 @@ helpviewer_keywords:
- "interoperation with unmanaged code, platform invoke"
- "platform invoke, creating class for functions"
- "DLL functions"
-ms.assetid: e08e4c34-0223-45f7-aa55-a3d8dd979b0f
---
# Creating a Class to Hold DLL Functions
-Wrapping a frequently used DLL function in a managed class is an effective approach to encapsulate platform functionality. Although it is not mandatory to do so in every case, providing a class wrapper is convenient because defining DLL functions can be cumbersome and error-prone. If you are programming in Visual Basic or C#, you must declare DLL functions within a class or Visual Basic module.
-
- Within a class, you define a static method for each DLL function you want to call. The definition can include additional information, such as the character set or the calling convention used in passing method arguments; by omitting this information, you select the default settings. For a complete list of declaration options and their default settings, see [Creating Prototypes in Managed Code](creating-prototypes-in-managed-code.md).
-
- Once wrapped, you can call the methods on the class as you call static methods on any other class. Platform invoke handles the underlying exported function automatically.
-
- When designing a managed class for platform invoke, consider the relationships between classes and DLL functions. For example, you can:
-
-- Declare DLL functions within an existing class.
-
-- Create an individual class for each DLL function, keeping functions isolated and easy to find.
-
-- Create one class for a set of related DLL functions to form logical groupings and reduce overhead.
-
- You can name the class and its methods as you please. For examples that demonstrate how to construct .NET-based declarations to be used with platform invoke, see [Marshalling Data with Platform Invoke](marshalling-data-with-platform-invoke.md).
-
+Wrapping a frequently used DLL function in a managed class is an effective approach to encapsulate platform functionality. Although it is not mandatory to do so in every case, providing a class wrapper is convenient because defining DLL functions can be cumbersome and error-prone. If you are programming in Visual Basic or C#, you must declare DLL functions within a class or Visual Basic module.
+
+ Within a class, you define a static method for each DLL function you want to call. The definition can include additional information, such as the character set or the calling convention used in passing method arguments; by omitting this information, you select the default settings. For a complete list of declaration options and their default settings, see [Creating Prototypes in Managed Code](creating-prototypes-in-managed-code.md).
+
+ Once wrapped, you can call the methods on the class as you call static methods on any other class. Platform invoke handles the underlying exported function automatically.
+
+ When designing a managed class for platform invoke, consider the relationships between classes and DLL functions. For example, you can:
+
+- Declare DLL functions within an existing class.
+
+- Create an individual class for each DLL function, keeping functions isolated and easy to find.
+
+- Create one class for a set of related DLL functions to form logical groupings and reduce overhead.
+
+ You can name the class and its methods as you please. For examples that demonstrate how to construct .NET-based declarations to be used with platform invoke, see [Marshalling Data with Platform Invoke](marshalling-data-with-platform-invoke.md).
+
## See also
- [Consuming Unmanaged DLL Functions](consuming-unmanaged-dll-functions.md)
diff --git a/docs/framework/interop/creating-prototypes-in-managed-code.md b/docs/standard/native-interop/creating-prototypes-in-managed-code.md
similarity index 73%
rename from docs/framework/interop/creating-prototypes-in-managed-code.md
rename to docs/standard/native-interop/creating-prototypes-in-managed-code.md
index 949f2a0a08dfb..4ea74f4824ad4 100644
--- a/docs/framework/interop/creating-prototypes-in-managed-code.md
+++ b/docs/standard/native-interop/creating-prototypes-in-managed-code.md
@@ -1,12 +1,13 @@
---
title: "Creating Prototypes in Managed Code"
description: Create prototypes in .NET managed code, so you can access unmanaged functions and use attribute fields that annotate method definition in managed code.
-ms.date: "03/30/2017"
-dev_langs:
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+dev_langs:
- "csharp"
- "vb"
- "cpp"
-helpviewer_keywords:
+helpviewer_keywords:
- "prototypes in managed code"
- "COM interop, DLL functions"
- "unmanaged functions"
@@ -17,22 +18,21 @@ helpviewer_keywords:
- "platform invoke, object fields"
- "DLL functions"
- "object fields in platform invoke"
-ms.assetid: ecdcf25d-cae3-4f07-a2b6-8397ac6dc42d
---
# Creating Prototypes in Managed Code
-This topic describes how to access unmanaged functions and introduces several attribute fields that annotate method definition in managed code. For examples that demonstrate how to construct .NET-based declarations to be used with platform invoke, see [Marshalling Data with Platform Invoke](marshalling-data-with-platform-invoke.md).
-
- Before you can access an unmanaged DLL function from managed code, you need to know the name of the function and the name of the DLL that exports it. With this information, you can begin to write the managed definition for an unmanaged function that is implemented in a DLL. Furthermore, you can adjust the way that platform invoke creates the function and marshals data to and from the function.
-
+This topic describes how to access unmanaged functions and introduces several attribute fields that annotate method definition in managed code. For examples that demonstrate how to construct .NET-based declarations to be used with platform invoke, see [Marshalling Data with Platform Invoke](marshalling-data-with-platform-invoke.md).
+
+ Before you can access an unmanaged DLL function from managed code, you need to know the name of the function and the name of the DLL that exports it. With this information, you can begin to write the managed definition for an unmanaged function that is implemented in a DLL. Furthermore, you can adjust the way that platform invoke creates the function and marshals data to and from the function.
+
> [!NOTE]
-> Windows API functions that allocate a string enable you to free the string by using a method such as `LocalFree`. Platform invoke handles such parameters differently. For platform invoke calls, make the parameter an `IntPtr` type instead of a `String` type. Use methods that are provided by the class to convert the type to a string manually and free it manually.
-
-## Declaration Basics
+> Windows API functions that allocate a string enable you to free the string by using a method such as `LocalFree`. Platform invoke handles such parameters differently. For platform invoke calls, make the parameter an `IntPtr` type instead of a `String` type. Use methods that are provided by the class to convert the type to a string manually and free it manually.
+
+## Declaration Basics
+
+ Managed definitions to unmanaged functions are language-dependent, as you can see in the following examples. For more complete code examples, see [Platform Invoke Examples](platform-invoke-examples.md).
- Managed definitions to unmanaged functions are language-dependent, as you can see in the following examples. For more complete code examples, see [Platform Invoke Examples](platform-invoke-examples.md).
-
```vb
Friend Class NativeMethods
Friend Declare Auto Function MessageBox Lib "user32.dll" (
@@ -42,9 +42,9 @@ Friend Class NativeMethods
ByVal uType As UInteger) As Integer
End Class
```
-
- To apply the , , , , , or fields to a Visual Basic declaration, you must use the attribute instead of the `Declare` statement.
-
+
+ To apply the , , , , , or fields to a Visual Basic declaration, you must use the attribute instead of the `Declare` statement.
+
```vb
Imports System.Runtime.InteropServices
@@ -58,7 +58,7 @@ Friend Class NativeMethods
End Function
End Class
```
-
+
```csharp
using System;
using System.Runtime.InteropServices;
@@ -70,7 +70,7 @@ internal static class NativeMethods
IntPtr hWnd, string lpText, string lpCaption, uint uType);
}
```
-
+
```cpp
using namespace System;
using namespace System::Runtime::InteropServices;
@@ -79,158 +79,158 @@ using namespace System::Runtime::InteropServices;
extern "C" int MessageBox(
IntPtr hWnd, String* lpText, String* lpCaption, unsigned int uType);
```
-
-## Adjusting the Definition
-
- Whether you set them explicitly or not, attribute fields are at work defining the behavior of managed code. Platform invoke operates according to the default values set on various fields that exist as metadata in an assembly. You can alter this default behavior by adjusting the values of one or more fields. In many cases, you use the to set a value.
-
- The following table lists the complete set of attribute fields that pertain to platform invoke. For each field, the table includes the default value and a link to information on how to use these fields to define unmanaged DLL functions.
-
-|Field|Description|
-|-----------|-----------------|
-||Enables or disables best-fit mapping.|
-||Specifies the calling convention to use in passing method arguments. The default is `WinAPI`, which corresponds to `__stdcall` for the 32-bit Intel-based platforms.|
-||Controls name mangling and the way that string arguments should be marshalled to the function. The default is `CharSet.Ansi`.|
-||Specifies the DLL entry point to be called.|
-||Controls whether an entry point should be modified to correspond to the character set. The default value varies by programming language.|
-||Controls whether the managed method signature should be transformed into an unmanaged signature that returns an HRESULT and has an additional [out, retval] argument for the return value.
The default is `true` (the signature should not be transformed).|
-||Enables the caller to use the `Marshal.GetLastWin32Error` API function to determine whether an error occurred while executing the method. In Visual Basic, the default is `true`; in C# and C++, the default is `false`.|
-||Controls throwing of an exception on an unmappable Unicode character that is converted to an ANSI "?" character.|
-
- For detailed reference information, see .
-
-## Platform invoke security considerations
-
- The `Assert`, `Deny`, and `PermitOnly` members of the enumeration are referred to as *stack walk modifiers*. These members are ignored if they are used as declarative attributes on platform invoke declarations and COM Interface Definition Language (IDL) statements.
-
-### Platform Invoke Examples
-
- The platform invoke samples in this section illustrate the use of the `RegistryPermission` attribute with the stack walk modifiers.
-
- In the following example, the `Assert`, `Deny`, and `PermitOnly` modifiers are ignored.
-
-```csharp
-[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
-[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
- private static extern bool CallRegistryPermissionAssert();
-
-[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
-[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
- private static extern bool CallRegistryPermissionDeny();
-
-[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
-[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
- private static extern bool CallRegistryPermissionDeny();
-```
-
- However, the `Demand` modifier in the following example is accepted.
-
+
+## Adjusting the Definition
+
+ Whether you set them explicitly or not, attribute fields are at work defining the behavior of managed code. Platform invoke operates according to the default values set on various fields that exist as metadata in an assembly. You can alter this default behavior by adjusting the values of one or more fields. In many cases, you use the to set a value.
+
+ The following table lists the complete set of attribute fields that pertain to platform invoke. For each field, the table includes the default value and a link to information on how to use these fields to define unmanaged DLL functions.
+
+|Field|Description|
+|-----------|-----------------|
+||Enables or disables best-fit mapping.|
+||Specifies the calling convention to use in passing method arguments. The default is `WinAPI`, which corresponds to `__stdcall` for the 32-bit Intel-based platforms.|
+||Controls name mangling and the way that string arguments should be marshalled to the function. The default is `CharSet.Ansi`.|
+||Specifies the DLL entry point to be called.|
+||Controls whether an entry point should be modified to correspond to the character set. The default value varies by programming language.|
+||Controls whether the managed method signature should be transformed into an unmanaged signature that returns an HRESULT and has an additional [out, retval] argument for the return value.
The default is `true` (the signature should not be transformed).|
+||Enables the caller to use the `Marshal.GetLastWin32Error` API function to determine whether an error occurred while executing the method. In Visual Basic, the default is `true`; in C# and C++, the default is `false`.|
+||Controls throwing of an exception on an unmappable Unicode character that is converted to an ANSI "?" character.|
+
+ For detailed reference information, see .
+
+## Platform invoke security considerations
+
+ The `Assert`, `Deny`, and `PermitOnly` members of the enumeration are referred to as *stack walk modifiers*. These members are ignored if they are used as declarative attributes on platform invoke declarations and COM Interface Definition Language (IDL) statements.
+
+### Platform Invoke Examples
+
+ The platform invoke samples in this section illustrate the use of the `RegistryPermission` attribute with the stack walk modifiers.
+
+ In the following example, the `Assert`, `Deny`, and `PermitOnly` modifiers are ignored.
+
+```csharp
+[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
+[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
+ private static extern bool CallRegistryPermissionAssert();
+
+[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
+[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
+ private static extern bool CallRegistryPermissionDeny();
+
+[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
+[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
+ private static extern bool CallRegistryPermissionDeny();
+```
+
+ However, the `Demand` modifier in the following example is accepted.
+
```csharp
-[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
-[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
- private static extern bool CallRegistryPermissionDeny();
-```
-
- modifiers do work correctly if they are placed on a class that contains (wraps) the platform invoke call.
-
-```cpp
- [RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
-public ref class PInvokeWrapper
-{
-public:
-[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
- private static extern bool CallRegistryPermissionDeny();
-};
-```
-
-```csharp
-[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
-class PInvokeWrapper
-{
-[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
- private static extern bool CallRegistryPermissionDeny();
-}
-```
-
- modifiers also work correctly in a nested scenario where they are placed on the caller of the platform invoke call:
-
-```cpp
- {
-public ref class PInvokeWrapper
-public:
- [DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
- private static extern bool CallRegistryPermissionDeny();
-
- [RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
- public static bool CallRegistryPermission()
- {
- return CallRegistryPermissionInternal();
- }
-};
-```
-
-```csharp
-class PInvokeScenario
-{
- [DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
- private static extern bool CallRegistryPermissionInternal();
-
- [RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
- public static bool CallRegistryPermission()
- {
- return CallRegistryPermissionInternal();
- }
-}
-```
-
-#### COM Interop Examples
-
- The COM interop samples in this section illustrate the use of the `RegistryPermission` attribute with the stack walk modifiers.
-
- The following COM interop interface declarations ignore the `Assert`, `Deny`, and `PermitOnly` modifiers, similarly to the platform invoke examples in the previous section.
-
+[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
+[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
+ private static extern bool CallRegistryPermissionDeny();
+```
+
+ modifiers do work correctly if they are placed on a class that contains (wraps) the platform invoke call.
+
+```cpp
+ [RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
+public ref class PInvokeWrapper
+{
+public:
+[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
+ private static extern bool CallRegistryPermissionDeny();
+};
+```
+
```csharp
-[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
-interface IAssertStubsItf
-{
-[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
- bool CallRegistryPermission();
-[FileIOPermission(SecurityAction.Assert, Unrestricted = true)]
- bool CallFileIoPermission();
-}
-
-[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
-interface IDenyStubsItf
-{
-[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
- bool CallRegistryPermission();
-[FileIOPermission(SecurityAction.Deny, Unrestricted = true)]
- bool CallFileIoPermission();
-}
-
-[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
-interface IAssertStubsItf
-{
-[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
- bool CallRegistryPermission();
-[FileIOPermission(SecurityAction.PermitOnly, Unrestricted = true)]
- bool CallFileIoPermission();
-}
-```
-
- Additionally, the `Demand` modifier is not accepted in COM interop interface declaration scenarios, as shown in the following example.
-
-```csharp
-[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
-interface IDemandStubsItf
-{
-[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
- bool CallRegistryPermission();
-[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
- bool CallFileIoPermission();
-}
-```
-
+[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
+class PInvokeWrapper
+{
+[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
+ private static extern bool CallRegistryPermissionDeny();
+}
+```
+
+ modifiers also work correctly in a nested scenario where they are placed on the caller of the platform invoke call:
+
+```cpp
+ {
+public ref class PInvokeWrapper
+public:
+ [DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
+ private static extern bool CallRegistryPermissionDeny();
+
+ [RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
+ public static bool CallRegistryPermission()
+ {
+ return CallRegistryPermissionInternal();
+ }
+};
+```
+
+```csharp
+class PInvokeScenario
+{
+ [DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
+ private static extern bool CallRegistryPermissionInternal();
+
+ [RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
+ public static bool CallRegistryPermission()
+ {
+ return CallRegistryPermissionInternal();
+ }
+}
+```
+
+#### COM Interop Examples
+
+ The COM interop samples in this section illustrate the use of the `RegistryPermission` attribute with the stack walk modifiers.
+
+ The following COM interop interface declarations ignore the `Assert`, `Deny`, and `PermitOnly` modifiers, similarly to the platform invoke examples in the previous section.
+
+```csharp
+[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
+interface IAssertStubsItf
+{
+[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
+ bool CallRegistryPermission();
+[FileIOPermission(SecurityAction.Assert, Unrestricted = true)]
+ bool CallFileIoPermission();
+}
+
+[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
+interface IDenyStubsItf
+{
+[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
+ bool CallRegistryPermission();
+[FileIOPermission(SecurityAction.Deny, Unrestricted = true)]
+ bool CallFileIoPermission();
+}
+
+[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
+interface IAssertStubsItf
+{
+[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
+ bool CallRegistryPermission();
+[FileIOPermission(SecurityAction.PermitOnly, Unrestricted = true)]
+ bool CallFileIoPermission();
+}
+```
+
+ Additionally, the `Demand` modifier is not accepted in COM interop interface declaration scenarios, as shown in the following example.
+
+```csharp
+[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
+interface IDemandStubsItf
+{
+[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
+ bool CallRegistryPermission();
+[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
+ bool CallFileIoPermission();
+}
+```
+
## See also
- [Consuming Unmanaged DLL Functions](consuming-unmanaged-dll-functions.md)
diff --git a/docs/framework/interop/default-marshalling-behavior.md b/docs/standard/native-interop/default-marshalling-behavior.md
similarity index 98%
rename from docs/framework/interop/default-marshalling-behavior.md
rename to docs/standard/native-interop/default-marshalling-behavior.md
index e1188a7a8dd40..816a6a54c827e 100644
--- a/docs/framework/interop/default-marshalling-behavior.md
+++ b/docs/standard/native-interop/default-marshalling-behavior.md
@@ -1,7 +1,8 @@
---
title: "Default Marshalling Behavior"
description: Learn default marshalling behavior in .NET. Review memory management with interop marshalling, and see default marshalling for classes, delegates, and value types.
-ms.date: "06/26/2018"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
@@ -9,7 +10,6 @@ helpviewer_keywords:
- "interop marshalling, default"
- "interoperation with unmanaged code, marshalling"
- "marshaling behavior"
-ms.assetid: c0a9bcdf-3df8-4db3-b1b6-abbdb2af809a
---
# Default Marshalling Behavior
@@ -350,7 +350,7 @@ interface _Graphics {
}
```
- The same rules used to marshal values and references to platform invoke calls are used when marshalling through COM interfaces. For example, when an instance of the `Point` value type is passed from the .NET Framework to COM, the `Point` is passed by value. If the `Point` value type is passed by reference, a pointer to a `Point` is passed on the stack. The interop marshaller does not support higher levels of indirection (**Point** \*\*) in either direction.
+ The same rules used to marshal values and references to platform invoke calls are used when marshalling through COM interfaces. For example, when an instance of the `Point` value type is passed from the .NET runtime to COM, the `Point` is passed by value. If the `Point` value type is passed by reference, a pointer to a `Point` is passed on the stack. The interop marshaller does not support higher levels of indirection (**Point** \*\*) in either direction.
> [!NOTE]
> Structures having the enumeration value set to `Explicit` cannot be used in COM interop because the exported type library cannot express an explicit layout.
diff --git a/docs/framework/interop/default-marshalling-for-arrays.md b/docs/standard/native-interop/default-marshalling-for-arrays.md
similarity index 97%
rename from docs/framework/interop/default-marshalling-for-arrays.md
rename to docs/standard/native-interop/default-marshalling-for-arrays.md
index da72f6ffe330e..8164f00b685d6 100644
--- a/docs/framework/interop/default-marshalling-for-arrays.md
+++ b/docs/standard/native-interop/default-marshalling-for-arrays.md
@@ -1,14 +1,14 @@
---
title: "Default Marshalling for Arrays"
description: Understand default marshalling for arrays. Review managed arrays, unmanaged arrays, passing array parameters to .NET code, and passing arrays to COM.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
helpviewer_keywords:
- "interop marshalling, arrays"
- "arrays, interop marshalling"
-ms.assetid: 8a3cca8b-dd94-4e3d-ad9a-9ee7590654bc
---
# Default Marshalling for Arrays
@@ -49,7 +49,7 @@ In an application consisting entirely of managed code, the common language runti
When a safe array is imported from a type library to a .NET assembly, the array is converted to a one-dimensional array of a known type (such as **int**). The same type conversion rules that apply to parameters also apply to array elements. For example, a safe array of `BSTR` types becomes a managed array of strings and a safe array of variants becomes a managed array of objects. The `SAFEARRAY` element type is captured from the type library and saved in the `SAFEARRAY` value of the enumeration.
- Because the rank and bounds of the safe array cannot be determined from the type library, the rank is assumed to equal 1 and the lower bound is assumed to equal 0. The rank and bounds must be defined in the managed signature produced by the [Type Library Importer (Tlbimp.exe)](../tools/tlbimp-exe-type-library-importer.md). If the rank passed to the method at runtime differs, a is thrown. If the type of the array passed at runtime differs, a is thrown. The following example shows safe arrays in managed and unmanaged code.
+ Because the rank and bounds of the safe array cannot be determined from the type library, the rank is assumed to equal 1 and the lower bound is assumed to equal 0. The rank and bounds must be defined in the managed signature produced by the [Type Library Importer (Tlbimp.exe)](../../framework/tools/tlbimp-exe-type-library-importer.md). If the rank passed to the method at runtime differs, a is thrown. If the type of the array passed at runtime differs, a is thrown. The following example shows safe arrays in managed and unmanaged code.
**Unmanaged signature**
@@ -301,7 +301,7 @@ HRESULT New(long ar[]);
HRESULT New(LPStr ar[]);
```
- Nested arrays cannot be marshalled. For example, the following signature generates an error when exported with the [Type Library Exporter (Tlbexp.exe)](../tools/tlbexp-exe-type-library-exporter.md).
+ Nested arrays cannot be marshalled. For example, the following signature generates an error when exported with the [Type Library Exporter (Tlbexp.exe)](../../framework/tools/tlbexp-exe-type-library-exporter.md).
#### Managed signature
diff --git a/docs/framework/interop/default-marshalling-for-objects.md b/docs/standard/native-interop/default-marshalling-for-objects.md
similarity index 96%
rename from docs/framework/interop/default-marshalling-for-objects.md
rename to docs/standard/native-interop/default-marshalling-for-objects.md
index 200a786b6b197..51c4f18cddb3e 100644
--- a/docs/framework/interop/default-marshalling-for-objects.md
+++ b/docs/standard/native-interop/default-marshalling-for-objects.md
@@ -1,14 +1,14 @@
---
title: "Default Marshalling for Objects"
description: Understand default marshalling for objects. Review marshalling options. Marshal objects to interfaces or variants, variants to objects, and ByRef variants.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
helpviewer_keywords:
- "objects, interop marshalling"
- "interop marshalling, objects"
-ms.assetid: c2ef0284-b061-4e12-b6d3-6a502b9cc558
---
# Default Marshalling for Objects
@@ -241,7 +241,7 @@ The value of the COM variant is determined by calling the **IConvertible.To** *T
## Marshalling Variant to Object
-When marshalling a variant to an object, the type, and sometimes the value, of the marshalled variant determines the type of object produced. The following table identifies each variant type and the corresponding object type that the m marshallerreates when a variant is passed from COM to the .NET Framework.
+When marshalling a variant to an object, the type, and sometimes the value, of the marshalled variant determines the type of object produced. The following table identifies each variant type and the corresponding object type that the marshaller creates when a variant is passed from COM to .NET.
|COM variant type|Object type|
|----------------------|-----------------|
@@ -271,7 +271,7 @@ When marshalling a variant to an object, the type, and sometimes the value, of t
|**VT_RECORD**|Corresponding boxed value type.|
|**VT_VARIANT**|Not supported.|
-Variant types passed from COM to managed code and then back to COM might not retain the same variant type for the duration of the call. Consider what happens when a variant of type `VT_DISPATCH` is passed from COM to the .NET Framework. During marshalling, the variant is converted to a . If the `Object` is then passed back to COM, it is marshalled back to a variant of type **VT_UNKNOWN**. There is no guarantee that the variant produced when an object is marshalled from managed code to COM will be the same type as the variant initially used to produce the object.
+Variant types passed from COM to managed code and then back to COM might not retain the same variant type for the duration of the call. Consider what happens when a variant of type `VT_DISPATCH` is passed from COM to .NET. During marshalling, the variant is converted to a . If the `Object` is then passed back to COM, it is marshalled back to a variant of type **VT_UNKNOWN**. There is no guarantee that the variant produced when an object is marshalled from managed code to COM will be the same type as the variant initially used to produce the object.
## Marshalling ByRef Variants
diff --git a/docs/framework/interop/default-marshalling-for-strings.md b/docs/standard/native-interop/default-marshalling-for-strings.md
similarity index 98%
rename from docs/framework/interop/default-marshalling-for-strings.md
rename to docs/standard/native-interop/default-marshalling-for-strings.md
index 1e83df51b68bc..2d92a1eb84fc3 100644
--- a/docs/framework/interop/default-marshalling-for-strings.md
+++ b/docs/standard/native-interop/default-marshalling-for-strings.md
@@ -1,7 +1,7 @@
---
title: "Default Marshalling for Strings"
description: Review the default marshalling behavior for strings in interfaces, platform invoke, structures, & fixed-length string buffers in .NET.
-ms.date: 03/11/2026
+ms.date: 07/08/2026
ai-usage: ai-assisted
dev_langs:
- "csharp"
@@ -9,7 +9,6 @@ dev_langs:
helpviewer_keywords:
- "strings, interop marshalling"
- "interop marshalling, strings"
-ms.assetid: 9baea3ce-27b3-4b4f-af98-9ad0f9467e6f
---
# Default marshalling for strings
@@ -76,7 +75,7 @@ interface IStringWorker : IDispatch
## Strings used in platform invoke
-When the CharSet is Unicode or a string argument is explicitly marked as [MarshalAs(UnmanagedType.LPWSTR)] and the string is passed by value (not `ref` or `out`), the string is pinned and used directly by native code. Otherwise, platform invoke copies string arguments, converting from the .NET Framework format (Unicode) to the platform unmanaged format. Strings are immutable and are not copied back from unmanaged memory to managed memory when the call returns.
+When the CharSet is Unicode or a string argument is explicitly marked as [MarshalAs(UnmanagedType.LPWSTR)] and the string is passed by value (not `ref` or `out`), the string is pinned and used directly by native code. Otherwise, platform invoke copies string arguments, converting from the .NET string format (Unicode) to the platform unmanaged format. Strings are immutable and are not copied back from unmanaged memory to managed memory when the call returns.
Native code is only responsible for releasing the memory when the string is passed by reference and it assigns a new value. Otherwise, the .NET runtime owns the memory and will release it after the call.
@@ -240,7 +239,7 @@ int GetWindowText(
);
```
-A `char[]` can be dereferenced and modified by the callee. The recommended approach is to use to rent a `char[]`, which avoids repeated heap allocations. The following code example demonstrates this pattern.
+A `char[]` can be dereferenced and modified by the callee. The recommended approach is to use to rent a `char[]`, which avoids repeated heap allocations. The following code example demonstrates this pattern.
```csharp
using System;
@@ -296,7 +295,7 @@ Public Class Window
End Class
```
-You might also consider passing a instead of a . The buffer that's created when a `StringBuilder` is marshalled can be dereferenced and modified by the callee, provided it doesn't exceed the capacity of the `StringBuilder`. It can also be initialized to a fixed length. For example, if you initialize a `StringBuilder` buffer to a capacity of `N`, the marshaller provides a buffer of size (`N`+1) characters. The +1 accounts for the fact that the unmanaged string has a null terminator while `StringBuilder` doesn't.
+You might also consider passing a instead of a . The buffer that's created when a `StringBuilder` is marshalled can be dereferenced and modified by the callee, provided it doesn't exceed the capacity of the `StringBuilder`. It can also be initialized to a fixed length. For example, if you initialize a `StringBuilder` buffer to a capacity of `N`, the marshaller provides a buffer of size (`N`+1) characters. The +1 accounts for the fact that the unmanaged string has a null terminator while `StringBuilder` doesn't.
> [!CAUTION]
> Avoid `StringBuilder` parameters when performance matters. Marshalling a `StringBuilder` *always* creates a native buffer copy. A typical call to get a string out of native code can result in four allocations:
diff --git a/docs/framework/interop/deploying-an-interop-application.md b/docs/standard/native-interop/deploying-an-interop-application.md
similarity index 50%
rename from docs/framework/interop/deploying-an-interop-application.md
rename to docs/standard/native-interop/deploying-an-interop-application.md
index 0ea17c1fd3820..38169948e2e41 100644
--- a/docs/framework/interop/deploying-an-interop-application.md
+++ b/docs/standard/native-interop/deploying-an-interop-application.md
@@ -1,50 +1,52 @@
---
-title: "Deploying an Interop Application"
+title: "Deploy an interop application"
description: Deploy an interop application, which usually has a .NET client assembly, interop assemblies of distinct COM type libraries, and registered COM components.
-ms.date: "03/30/2017"
-helpviewer_keywords:
- - "deploying applications [.NET Framework], interop"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
+ - "deploying applications [.NET], interop"
- "strong-named assemblies, interop applications"
- "unsigned assemblies"
- "private assemblies"
- - "exposing COM components to .NET Framework"
+ - "exposing COM components to .NET"
- "interoperation with unmanaged code, deploying applications"
- "shared assemblies"
- "COM interop, deploying applications"
- "interoperation with unmanaged code, exposing COM components"
- "signed assemblies"
- "COM interop, exposing COM components"
-ms.assetid: ea8a403e-ae03-4faa-9d9b-02179ec72992
---
-# Deploying an Interop Application
-
-An interop application typically includes a .NET client assembly, one or more interop assemblies representing distinct COM type libraries, and one or more registered COM components. Visual Studio and the Windows SDK provide tools to import and convert a type library to an interop assembly, as discussed in [Importing a Type Library as an Assembly](importing-a-type-library-as-an-assembly.md). There are two ways to deploy an interop application:
-
-- By using embedded interop types: Beginning with the .NET Framework 4, you can instruct the compiler to embed type information from an interop assembly into your executable. The compiler embeds only the type information that your application uses. You do not have to deploy the interop assembly with your application. This is the recommended technique.
-
-- By deploying interop assemblies: You can create a standard reference to an interop assembly. In this case, the interop assembly must be deployed with your application. If you employ this technique, and you are not using a private COM component, always reference the primary interop assembly (PIA) published by the author of the COM component you intend to incorporate in your managed code. For more information about producing and using primary interop assemblies, see [Primary Interop Assemblies](/previous-versions/dotnet/netframework-4.0/aax7sdch(v=vs.100)).
-
- If you use embedded interop types, deployment is simple and straightforward. There is nothing special you need to do. The rest of this article describes the scenarios for deploying interop assemblies with your application.
-
-## Deploying Interop Assemblies
-
- Assemblies can have strong names. A strong-named assembly includes the publisher's public key, which provides a unique identity. Assemblies that are produced by the [Type Library Importer (Tlbimp.exe)](../tools/tlbimp-exe-type-library-importer.md) can be signed by the publisher by using the **/keyfile** option. You can install signed assemblies into the global assembly cache. Unsigned assemblies must be installed on the user's machine as private assemblies.
-
-### Private Assemblies
-
- To install an assembly to be used privately, both the application executable and the interop assembly that contains imported COM types must be installed in the same directory structure. The following illustration shows an unsigned interop assembly to be used privately by Client1.exe and Client2.exe, which reside in separate application directories. The interop assembly, which is called LOANLib.dll in this example, is installed twice.
-
- 
-
- All COM components associated with the application must be installed in the Windows registry. If Client1.exe and Client2.exe in the illustration are installed on different computers, you must register the COM components on both computers.
-
-### Shared Assemblies
-
- Assemblies that are shared by multiple applications should be installed in a centralized repository called the global assembly cache. .NET clients can access the same copy of the interop assembly, which is signed and installed in the global assembly cache. For more information about producing and using primary interop assemblies, see [Primary Interop Assemblies](/previous-versions/dotnet/netframework-4.0/aax7sdch(v=vs.100)).
-
+# Deploy an interop application
+
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses legacy tools and deployment models, such as Tlbimp.exe, primary interop assemblies, the global assembly cache, and registry-based COM registration. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
+
+An interop application typically includes a .NET client assembly, one or more interop assemblies representing distinct COM type libraries, and one or more registered COM components. Visual Studio and the Windows SDK provide tools to import and convert a type library to an interop assembly, as discussed in [Import a type library as an assembly](importing-a-type-library-as-an-assembly.md). There are two ways to deploy an interop application:
+
+- By using embedded interop types: Instruct the compiler to embed type information from an interop assembly into your executable. The compiler embeds only the type information that your application uses. You do not have to deploy the interop assembly with your application. This is the recommended technique.
+- By deploying interop assemblies: Create a standard reference to an interop assembly. In this case, the interop assembly must be deployed with your application. If you employ this technique, and you are not using a private COM component, always reference the primary interop assembly (PIA) published by the author of the COM component you intend to incorporate in your managed code.
+
+ If you use embedded interop types, deployment is simple and straightforward. There is nothing special you need to do. The rest of this article describes the scenarios for deploying interop assemblies with your application.
+
+## Deploying Interop Assemblies
+
+ Assemblies can have strong names. A strong-named assembly includes the publisher's public key, which provides a unique identity. Assemblies that are produced by the [Type Library Importer (Tlbimp.exe)](../../framework/tools/tlbimp-exe-type-library-importer.md) can be signed by the publisher by using the **/keyfile** option. You can install signed assemblies into the global assembly cache. Unsigned assemblies must be installed on the user's machine as private assemblies.
+
+### Private Assemblies
+
+ To install an assembly to be used privately, both the application executable and the interop assembly that contains imported COM types must be installed in the same directory structure. The following illustration shows an unsigned interop assembly to be used privately by Client1.exe and Client2.exe, which reside in separate application directories. The interop assembly, which is called LOANLib.dll in this example, is installed twice.
+
+ 
+
+ All COM components associated with the application must be installed in the Windows registry. If Client1.exe and Client2.exe in the illustration are installed on different computers, you must register the COM components on both computers.
+
+### Shared Assemblies
+
+ Assemblies that are shared by multiple applications should be installed in a centralized repository called the global assembly cache. .NET clients can access the same copy of the interop assembly, which is signed and installed in the global assembly cache. For more information about producing and using primary interop assemblies, see [Primary Interop Assemblies](/previous-versions/dotnet/netframework-4.0/aax7sdch(v=vs.100)).
+
## See also
-- [Exposing COM Components to the .NET Framework](exposing-com-components.md)
-- [Importing a Type Library as an Assembly](importing-a-type-library-as-an-assembly.md)
+- [Expose COM components to .NET](exposing-com-components.md)
+- [Import a type library as an assembly](importing-a-type-library-as-an-assembly.md)
- [Using COM Types in Managed Code](/previous-versions/dotnet/netframework-4.0/3y76b69k(v=vs.100))
-- [Compiling an Interop Project](compiling-an-interop-project.md)
+- [Compile an interop project](compiling-an-interop-project.md)
diff --git a/docs/framework/interop/exposing-com-components.md b/docs/standard/native-interop/exposing-com-components.md
similarity index 58%
rename from docs/framework/interop/exposing-com-components.md
rename to docs/standard/native-interop/exposing-com-components.md
index ca0607c2b62c0..7b0cdf94e1108 100644
--- a/docs/framework/interop/exposing-com-components.md
+++ b/docs/standard/native-interop/exposing-com-components.md
@@ -1,41 +1,44 @@
---
-title: "Exposing COM Components to the .NET Framework"
+title: "Expose COM components to .NET"
description: Know the process of exposing COM components to .NET. COM components are valuable in managed code as middle-tier business applications or isolated functionality.
-ms.date: "03/30/2017"
-helpviewer_keywords:
- - "exposing COM components to .NET Framework"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
+ - "exposing COM components to .NET"
- "interoperation with unmanaged code, exposing COM components"
- "COM interop, exposing COM components"
-ms.assetid: e78b14f1-e487-43cd-9c6d-1a07483f1730
---
-# Exposing COM Components to the .NET Framework
-
-This section summarizes the process needed to expose an existing COM component to managed code. For details about writing COM servers that tightly integrate with the .NET Framework, see [Design Considerations for Interoperation](/previous-versions/dotnet/netframework-4.0/61aax4kh(v=vs.100)).
-
- Existing COM components are valuable resources in managed code as middle-tier business applications or as isolated functionality. An ideal component has a primary interop assembly and conforms tightly to the programming standards imposed by COM.
-
-#### To expose COM components to the .NET Framework
-
-1. [Import a type library as an assembly](importing-a-type-library-as-an-assembly.md).
-
- The common language runtime requires metadata for all types, including COM types. There are several ways to obtain an assembly containing COM types imported as metadata.
-
-2. [Use COM types in managed Code](/previous-versions/dotnet/netframework-4.0/3y76b69k(v=vs.100)).
-
- You can inspect COM types, activate instances, and invoke methods on the COM object the same way you do for any managed type.
-
-3. [Compile an interop project](compiling-an-interop-project.md).
-
- The Windows SDK provides compilers for several languages compliant with the Common Language Specification (CLS), including Visual Basic, C#, and C++.
-
-4. [Deploy an interop application](deploying-an-interop-application.md).
-
- Interop applications are best deployed as [strong-named](../../standard/assembly/strong-named.md), signed assemblies in the global assembly cache.
-
+# Expose COM components to .NET
+
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses legacy tools and deployment models, such as primary interop assemblies, the global assembly cache, and registry-based COM registration. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
+
+This section summarizes the process needed to expose an existing COM component to managed code.
+
+ Existing COM components are valuable resources in managed code as middle-tier business applications or as isolated functionality. An ideal component has a primary interop assembly and conforms tightly to the programming standards imposed by COM.
+
+## Expose COM components to .NET
+
+1. [Import a type library as an assembly](importing-a-type-library-as-an-assembly.md).
+
+ The common language runtime requires metadata for all types, including COM types. There are several ways to obtain an assembly containing COM types imported as metadata.
+
+2. [Use COM types in managed Code](/previous-versions/dotnet/netframework-4.0/3y76b69k(v=vs.100)).
+
+ You can inspect COM types, activate instances, and invoke methods on the COM object the same way you do for any managed type.
+
+3. [Compile an interop project](compiling-an-interop-project.md).
+
+ The Windows SDK provides compilers for several languages compliant with the Common Language Specification (CLS), including Visual Basic, C#, and C++.
+
+4. [Deploy an interop application](deploying-an-interop-application.md).
+
+ For .NET Framework, interop applications are often deployed as [strong-named](../../standard/assembly/strong-named.md), signed assemblies in the global assembly cache.
+
## See also
- [Interoperating with Unmanaged Code](index.md)
- [Design Considerations for Interoperation](/previous-versions/dotnet/netframework-4.0/61aax4kh(v=vs.100))
- [COM Interop Sample: .NET Client and COM Server](com-interop-sample-net-client-and-com-server.md)
- [Language Independence and Language-Independent Components](../../standard/language-independence.md)
-- [Gacutil.exe (Global Assembly Cache Tool)](../tools/gacutil-exe-gac-tool.md)
+- [Gacutil.exe (Global Assembly Cache Tool)](../../framework/tools/gacutil-exe-gac-tool.md)
diff --git a/docs/framework/interop/exposing-dotnet-components-to-com.md b/docs/standard/native-interop/exposing-dotnet-components-to-com.md
similarity index 64%
rename from docs/framework/interop/exposing-dotnet-components-to-com.md
rename to docs/standard/native-interop/exposing-dotnet-components-to-com.md
index 64cd4a5f4a8df..661138a5807c2 100644
--- a/docs/framework/interop/exposing-dotnet-components-to-com.md
+++ b/docs/standard/native-interop/exposing-dotnet-components-to-com.md
@@ -1,14 +1,17 @@
---
-title: "Exposing .NET components to COM"
+title: "Expose .NET components to COM"
description: Expose .NET components to COM. Qualify .NET types for interoperation. Apply interop attributes. Package an assembly for COM. Consume a managed type from COM.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- - "exposing .NET Framework components to COM"
- - "interoperation with unmanaged code, exposing .NET Framework components"
+ - "exposing .NET components to COM"
+ - "interoperation with unmanaged code, exposing .NET components"
- "COM interop, exposing COM components"
-ms.assetid: e42a65f7-1e61-411f-b09a-aca1bbce24c6
---
-# Exposing .NET components to COM
+# Expose .NET components to COM
+
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses legacy tools and deployment models, such as Regasm.exe, the global assembly cache, and registry-based COM registration. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
Writing a .NET type and consuming that type from unmanaged code are distinct activities for developers. This section describes several tips for writing managed code that interoperates with COM clients:
@@ -30,7 +33,7 @@ Writing a .NET type and consuming that type from unmanaged code are distinct act
1. [Register assemblies with COM](registering-assemblies-with-com.md).
- Types in an assembly (and type libraries) must be registered at design time. If an installer does not register the assembly, instruct COM developers to use Regasm.exe.
+ For .NET Framework, types in an assembly (and type libraries) must be registered at design time. If an installer does not register the assembly, instruct COM developers to use Regasm.exe.
2. [Reference .NET types from COM](how-to-reference-net-types-from-com.md).
@@ -42,9 +45,9 @@ Writing a .NET type and consuming that type from unmanaged code are distinct act
4. [Deploy an application for COM access](/previous-versions/dotnet/netframework-4.0/c2850st8(v=vs.100)).
- A strong-named assembly can be installed in the global assembly cache and requires a signature from its publisher. Assemblies that are not strong named must be installed in the application directory of the client.
+ For .NET Framework, a strong-named assembly can be installed in the global assembly cache and requires a signature from its publisher. Assemblies that are not strong named must be installed in the application directory of the client.
## See also
- [Interoperating with Unmanaged Code](index.md)
-- [COM Interop Sample: COM Client and .NET Server](com-interop-sample-com-client-and-net-server.md)
+- [COM interop sample: COM client and .NET server](com-interop-sample-com-client-and-net-server.md)
diff --git a/docs/framework/interop/how-to-add-references-to-type-libraries.md b/docs/standard/native-interop/how-to-add-references-to-type-libraries.md
similarity index 54%
rename from docs/framework/interop/how-to-add-references-to-type-libraries.md
rename to docs/standard/native-interop/how-to-add-references-to-type-libraries.md
index 47c7e0a2119a8..588b99dd29e9e 100644
--- a/docs/framework/interop/how-to-add-references-to-type-libraries.md
+++ b/docs/standard/native-interop/how-to-add-references-to-type-libraries.md
@@ -1,47 +1,50 @@
---
-title: "How to: Add References to Type Libraries"
+title: "Add references to type libraries"
description: Understand how to add references to type libraries in Visual Studio or for command-line compilation.
-ms.date: "03/30/2017"
-helpviewer_keywords:
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
- "importing type library"
- "interop assemblies, generating"
- "type libraries"
- "COM interop, importing type library"
-ms.assetid: f5cfa6ba-cc25-4017-82cd-ba7391859113
---
-# How to: Add References to Type Libraries
-
-Visual Studio generates an interop assembly containing metadata when you add a reference to a type library. If a primary interop assembly is available, Visual Studio uses the existing assembly before generating a new interop assembly.
-
-### To add a reference to a type library in Visual Studio
-
-1. Install the COM DLL or EXE file on your computer, unless a Windows Setup.exe file performs the installation for you.
-
-2. Choose **Project**, **Add Reference**.
-
-3. In the Reference Manager, choose **COM**.
-
-4. Select the type library from the list, or browse for the .tlb file.
-
-5. Choose **OK**.
-
-6. In Solution Explorer, open the shortcut menu for the reference you just added, and then choose **Properties**.
-
-7. In the **Properties** window, make sure that the **Embed Interop Types** property is set to **True**. This causes Visual Studio to embed type information for COM types in your executables, eliminating the need to deploy primary interop assemblies with your app.
-
+# Add references to type libraries
+
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses legacy Visual Studio type-library references and primary interop assemblies. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
+
+Visual Studio generates an interop assembly containing metadata when you add a reference to a type library. If a primary interop assembly is available, Visual Studio uses the existing assembly before generating a new interop assembly.
+
+## Add a reference to a type library in Visual Studio
+
+1. Install the COM DLL or EXE file on your computer, unless a Windows Setup.exe file performs the installation for you.
+
+2. Choose **Project**, **Add Reference**.
+
+3. In the Reference Manager, choose **COM**.
+
+4. Select the type library from the list, or browse for the .tlb file.
+
+5. Choose **OK**.
+
+6. In Solution Explorer, open the shortcut menu for the reference you just added, and then choose **Properties**.
+
+7. In the **Properties** window, make sure that the **Embed Interop Types** property is set to **True**. This causes Visual Studio to embed type information for COM types in your executables, eliminating the need to deploy primary interop assemblies with your app.
+
> [!NOTE]
-> The menu and dialog box options may vary depending on the version of Visual Studio you're using.
-
-### To add a reference to a type library for command-line compilation
-
-1. Generate an interop assembly as described in [How to: Generate Interop Assemblies from Type Libraries](how-to-generate-interop-assemblies-from-type-libraries.md).
-
-2. Use the [-link (C# Compiler Options)](../../csharp/language-reference/compiler-options/inputs.md#embedinteroptypes) or [-link (Visual Basic)](../../visual-basic/reference/command-line-compiler/link.md) compiler option with the interop assembly name to embed type information for COM types in your executables.
-
+> The menu and dialog box options may vary depending on the version of Visual Studio you're using.
+
+## Add a reference to a type library for command-line compilation
+
+1. Generate an interop assembly as described in [Generate interop assemblies from type libraries](how-to-generate-interop-assemblies-from-type-libraries.md).
+
+2. Use the [-link (C# Compiler Options)](../../csharp/language-reference/compiler-options/inputs.md#embedinteroptypes) or [-link (Visual Basic)](../../visual-basic/reference/command-line-compiler/link.md) compiler option with the interop assembly name to embed type information for COM types in your executables.
+
## See also
-- [Importing a Type Library as an Assembly](importing-a-type-library-as-an-assembly.md)
-- [Exposing COM Components to the .NET Framework](exposing-com-components.md)
+- [Import a type library as an assembly](importing-a-type-library-as-an-assembly.md)
+- [Expose COM components to .NET](exposing-com-components.md)
- [Walkthrough: Embedding Types from Managed Assemblies in Visual Studio](../../standard/assembly/embed-types-visual-studio.md)
- [-link (C# Compiler Options)](../../csharp/language-reference/compiler-options/inputs.md#embedinteroptypes)
- [-link (Visual Basic)](../../visual-basic/reference/command-line-compiler/link.md)
diff --git a/docs/standard/native-interop/how-to-generate-interop-assemblies-from-type-libraries.md b/docs/standard/native-interop/how-to-generate-interop-assemblies-from-type-libraries.md
new file mode 100644
index 0000000000000..7f82e778f34e7
--- /dev/null
+++ b/docs/standard/native-interop/how-to-generate-interop-assemblies-from-type-libraries.md
@@ -0,0 +1,45 @@
+---
+title: "Generate interop assemblies from type libraries"
+description: Generate interop assemblies from type libraries. Use Type Library Importer (Tlbimp.exe) to convert coclasses and interfaces from a COM type library to metadata.
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
+ - "importing type library"
+ - "interop assemblies, generating"
+ - "Type Library Importer"
+ - "type libraries"
+ - "COM interop, importing type library"
+---
+# Generate interop assemblies from type libraries
+
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses the legacy Type Library Importer (Tlbimp.exe). For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
+
+The [Type Library Importer (Tlbimp.exe)](../../framework/tools/tlbimp-exe-type-library-importer.md) is a command-line tool that converts the coclasses and interfaces contained in a COM type library to metadata. This tool creates an interop assembly and namespace for the type information automatically. After the metadata of a class is available, managed clients can create instances of the COM type and call its methods, just as if it were a .NET instance. Tlbimp.exe converts an entire type library to metadata at once and cannot generate type information for a subset of the types defined in a type library.
+
+## Generate an interop assembly from a type library
+
+To generate an interop assembly from a type library, use the following command:
+
+`tlbimp `
+
+Adding the `/out:` switch produces an interop assembly with an altered name, such as LOANLib.dll. Altering the interop assembly name can help distinguish it from the original COM DLL and prevent problems that can occur from having duplicate names.
+
+## Example
+
+ The following command produces the Loanlib.dll assembly in the `Loanlib` namespace.
+
+```console
+tlbimp Loanlib.tlb
+```
+
+ The following command produces an interop assembly with an altered name (LOANLib.dll).
+
+```console
+tlbimp LoanLib.tlb /out: LOANLib.dll
+```
+
+## See also
+
+- [Import a type library as an assembly](importing-a-type-library-as-an-assembly.md)
+- [Expose COM components to .NET](exposing-com-components.md)
diff --git a/docs/framework/interop/how-to-implement-callback-functions.md b/docs/standard/native-interop/how-to-implement-callback-functions.md
similarity index 98%
rename from docs/framework/interop/how-to-implement-callback-functions.md
rename to docs/standard/native-interop/how-to-implement-callback-functions.md
index 0ddd05607cca4..f7f07929c2e67 100644
--- a/docs/framework/interop/how-to-implement-callback-functions.md
+++ b/docs/standard/native-interop/how-to-implement-callback-functions.md
@@ -1,14 +1,14 @@
---
title: "How to: Implement Callback Functions"
description: See how to implement callback functions. In this example, a managed application, using platform invoke, prints the handle value for each window on a computer.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
- "cpp"
helpviewer_keywords:
- "callback function, implementing"
-ms.assetid: e55b3712-b9ea-4453-bd9a-ad5cfa2f6bfa
---
# How to: Implement callback functions
diff --git a/docs/framework/interop/how-to-map-hresults-and-exceptions.md b/docs/standard/native-interop/how-to-map-hresults-and-exceptions.md
similarity index 96%
rename from docs/framework/interop/how-to-map-hresults-and-exceptions.md
rename to docs/standard/native-interop/how-to-map-hresults-and-exceptions.md
index 480bdaeaf098e..e75513645b92c 100644
--- a/docs/framework/interop/how-to-map-hresults-and-exceptions.md
+++ b/docs/standard/native-interop/how-to-map-hresults-and-exceptions.md
@@ -1,7 +1,8 @@
---
-title: "How to: Map HRESULTs and Exceptions"
+title: "How to: Map HRESULTs and exceptions"
description: Review how to map HRESULT values returned from COM methods to exceptions thrown by .NET methods. The runtime handles the transition between COM and .NET.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "cpp"
helpviewer_keywords:
@@ -11,11 +12,10 @@ helpviewer_keywords:
- "HRESULTs"
- "COM interop, HRESULTs"
- "COM interop, exceptions"
-ms.assetid: 610b364b-2761-429d-9c4a-afbc3e66f1b9
---
-# How to: Map HRESULTs and Exceptions
+# How to: Map HRESULTs and exceptions
-COM methods report errors by returning HRESULTs; .NET methods report them by throwing exceptions. The runtime handles the transition between the two. Each exception class in the .NET Framework maps to an HRESULT.
+COM methods report errors by returning HRESULTs; .NET methods report them by throwing exceptions. The runtime handles the transition between the two. Each exception class in .NET maps to an HRESULT.
User-defined exception classes can specify whatever HRESULT is appropriate. These exception classes can dynamically change the HRESULT to be returned when the exception is generated by setting the `HResult` field on the exception object. Additional information about the exception is provided to the client through the `IErrorInfo` interface, which is implemented on the .NET object in the unmanaged process.
diff --git a/docs/framework/interop/how-to-reference-net-types-from-com.md b/docs/standard/native-interop/how-to-reference-net-types-from-com.md
similarity index 65%
rename from docs/framework/interop/how-to-reference-net-types-from-com.md
rename to docs/standard/native-interop/how-to-reference-net-types-from-com.md
index b34079568ff21..c7f6e2f01ce02 100644
--- a/docs/framework/interop/how-to-reference-net-types-from-com.md
+++ b/docs/standard/native-interop/how-to-reference-net-types-from-com.md
@@ -1,7 +1,8 @@
---
-title: "How to: Reference .NET Types from COM"
+title: "Reference .NET types from COM"
description: Reference .NET types from COM. VB clients can view a .NET object in the object browser, but C++ clients must reference a TLB file with the \#import directive.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "cpp"
helpviewer_keywords:
@@ -12,15 +13,17 @@ helpviewer_keywords:
- "interoperation with unmanaged code, importing type library"
- "type libraries"
- "COM interop, importing type library"
-ms.assetid: 54917f6f-cb18-4103-b622-856b55da93f3
---
-# How to: Reference .NET Types from COM
+# Reference .NET types from COM
-From the point of view of client and server code, the differences between COM and the .NET Framework are largely invisible. Microsoft Visual Basic clients can view a .NET object in the object browser, which exposes the object methods and syntax, properties, and fields exactly as if it were any other COM object.
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses legacy type libraries generated by tools such as Tlbexp.exe. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
+
+From the point of view of client and server code, the differences between COM and .NET are largely invisible. Microsoft Visual Basic clients can view a .NET object in the object browser, which exposes the object methods and syntax, properties, and fields exactly as if it were any other COM object.
The process for importing a type library is slightly more complicated for C++ clients, although you use the same tools to export metadata to a COM type library. To reference .NET object members from an unmanaged C++ client, reference the TLB file (produced with Tlbexp.exe) with the **#import** directive. When referencing a type library from C++, you must either specify the `raw_interfaces_only` option or import the definitions in the base class library, Mscorlib.tlb.
-### To import a library
+## Import a library
- Specify the `raw_interfaces_only` option in the **#import** directive. For example:
@@ -39,7 +42,7 @@ From the point of view of client and server code, the differences between COM an
## See also
-- [Exposing .NET Framework Components to COM](exposing-dotnet-components-to-com.md)
-- [Registering Assemblies with COM](registering-assemblies-with-com.md)
+- [Expose .NET components to COM](exposing-dotnet-components-to-com.md)
+- [Register .NET Framework assemblies with COM](registering-assemblies-with-com.md)
- [Calling a .NET Object](/previous-versions/dotnet/netframework-4.0/8hw8h46b(v=vs.100))
- [Deploying an Application for COM Access](/previous-versions/dotnet/netframework-4.0/c2850st8(v=vs.100))
diff --git a/docs/framework/interop/identifying-functions-in-dlls.md b/docs/standard/native-interop/identifying-functions-in-dlls.md
similarity index 97%
rename from docs/framework/interop/identifying-functions-in-dlls.md
rename to docs/standard/native-interop/identifying-functions-in-dlls.md
index c58f0ad69a357..d48cdf72ad378 100644
--- a/docs/framework/interop/identifying-functions-in-dlls.md
+++ b/docs/standard/native-interop/identifying-functions-in-dlls.md
@@ -1,7 +1,8 @@
---
title: "Identifying Functions in DLLs"
description: Identify functions in DLLs. A DLL function's identity consists of a function name or ordinal, and the DLL file name in which the implementation can be found.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "platform invoke, identifying functions"
- "COM interop, DLL functions"
@@ -11,7 +12,6 @@ helpviewer_keywords:
- "interoperation with unmanaged code, platform invoke"
- "identifying DLL functions"
- "DLL functions"
-ms.assetid: 3e3f6780-6d90-4413-bad7-ba641220364d
---
# Identifying Functions in DLLs
diff --git a/docs/framework/interop/importing-a-type-library-as-an-assembly.md b/docs/standard/native-interop/importing-a-type-library-as-an-assembly.md
similarity index 73%
rename from docs/framework/interop/importing-a-type-library-as-an-assembly.md
rename to docs/standard/native-interop/importing-a-type-library-as-an-assembly.md
index 6878e47609f3a..8ca59ec17799c 100644
--- a/docs/framework/interop/importing-a-type-library-as-an-assembly.md
+++ b/docs/standard/native-interop/importing-a-type-library-as-an-assembly.md
@@ -1,13 +1,14 @@
---
-title: "Importing a Type Library as an Assembly"
+title: "Import a type library as an assembly"
description: Import a type library, which contains COM type definitions, as an assembly. Learn ways to create metadata from a type library, resulting in an interop assembly.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "importing type library"
- "type metadata"
- "custom wrappers"
- "metadata"
- - "exposing COM components to .NET Framework"
+ - "exposing COM components to .NET"
- "Type Library Importer"
- "interoperation with unmanaged code, importing type library"
- "interoperation with unmanaged code, exposing COM components"
@@ -15,15 +16,17 @@ helpviewer_keywords:
- "TypeLibConverter class, importing type library as assembly"
- "COM interop, importing type library"
- "COM interop, exposing COM components"
-ms.assetid: d1898229-cd40-426e-a275-f3eb65fbc79f
---
-# Importing a Type Library as an Assembly
+# Import a type library as an assembly
-COM type definitions usually reside in a type library. In contrast, CLS-compliant compilers produce type metadata in an assembly. The two sources of type information are quite different. This topic describes techniques for generating metadata from a type library. The resulting assembly is called an interop assembly, and the type information it contains enables .NET Framework applications to use COM types.
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses legacy tools and deployment models, such as Tlbimp.exe and primary interop assemblies. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
+
+COM type definitions usually reside in a type library. In contrast, CLS-compliant compilers produce type metadata in an assembly. The two sources of type information are quite different. This topic describes techniques for generating metadata from a type library. The resulting assembly is called an interop assembly, and the type information it contains enables .NET applications to use COM types.
There are two ways to make this type information available to your application:
-- Using design-time-only interop assemblies: Beginning with the .NET Framework 4, you can instruct the compiler to embed type information from the interop assembly into your executable. The compiler embeds only the type information that your application uses. You do not have to deploy the interop assembly with your application. This is the recommended technique.
+- Using design-time-only interop assemblies: Beginning with .NET Framework 4, you can instruct the compiler to embed type information from the interop assembly into your executable. The compiler embeds only the type information that your application uses. You do not have to deploy the interop assembly with your application. This is the recommended technique.
- Deploying interop assemblies: You can create a standard reference to the interop assembly. In this case, the interop assembly must be deployed with your application. If you employ this technique, and you are not using a private COM component, always reference the primary interop assembly (PIA) published by the author of the COM component you intend to incorporate in your managed code. For more information about producing and using primary interop assemblies, see [Primary Interop Assemblies](/previous-versions/dotnet/netframework-4.0/aax7sdch(v=vs.100)).
@@ -39,11 +42,11 @@ After you locate the type library that contains the implementation of your targe
- Visual Studio
- Visual Studio automatically converts COM types in a type library to metadata in an assembly. For instructions, see [How to: Add References to Type Libraries](how-to-add-references-to-type-libraries.md).
+ Visual Studio automatically converts COM types in a type library to metadata in an assembly. For instructions, see [Add references to type libraries](how-to-add-references-to-type-libraries.md).
-- [Type Library Importer (Tlbimp.exe)](../tools/tlbimp-exe-type-library-importer.md)
+- [Type Library Importer (Tlbimp.exe)](../../framework/tools/tlbimp-exe-type-library-importer.md)
- The Type Library Importer provides command-line options to adjust metadata in the resulting interop file, imports types from an existing type library, and generates an interop assembly and a namespace. For instructions, see [How to: Generate Interop Assemblies from Type Libraries](how-to-generate-interop-assemblies-from-type-libraries.md).
+ The Type Library Importer provides command-line options to adjust metadata in the resulting interop file, imports types from an existing type library, and generates an interop assembly and a namespace. For instructions, see [Generate interop assemblies from type libraries](how-to-generate-interop-assemblies-from-type-libraries.md).
- class
@@ -57,7 +60,7 @@ After you locate the type library that contains the implementation of your targe
- Precise descriptions of the coclasses and interfaces being defined.
- - A compiler, such as the C# compiler, that can generate the appropriate .NET Framework class definitions.
+ - A compiler, such as the C# compiler, that can generate the appropriate .NET class definitions.
- Knowledge of the type library-to-assembly conversion rules.
@@ -68,12 +71,12 @@ After you locate the type library that contains the implementation of your targe
## See also
-
-- [Exposing COM Components to the .NET Framework](exposing-com-components.md)
+- [Expose COM components to .NET](exposing-com-components.md)
- [Type Library to Assembly Conversion Summary](/previous-versions/dotnet/netframework-4.0/k83zzh38(v=vs.100))
-- [Tlbimp.exe (Type Library Importer)](../tools/tlbimp-exe-type-library-importer.md)
+- [Tlbimp.exe (Type Library Importer)](../../framework/tools/tlbimp-exe-type-library-importer.md)
- [Customizing Standard Wrappers](/previous-versions/dotnet/netframework-4.0/h7hx9abd(v=vs.100))
- [Using COM Types in Managed Code](/previous-versions/dotnet/netframework-4.0/3y76b69k(v=vs.100))
-- [Compiling an Interop Project](compiling-an-interop-project.md)
-- [Deploying an Interop Application](deploying-an-interop-application.md)
-- [How to: Add References to Type Libraries](how-to-add-references-to-type-libraries.md)
-- [How to: Generate Interop Assemblies from Type Libraries](how-to-generate-interop-assemblies-from-type-libraries.md)
+- [Compile an interop project](compiling-an-interop-project.md)
+- [Deploy an interop application](deploying-an-interop-application.md)
+- [Add references to type libraries](how-to-add-references-to-type-libraries.md)
+- [Generate interop assemblies from type libraries](how-to-generate-interop-assemblies-from-type-libraries.md)
diff --git a/docs/standard/native-interop/index.md b/docs/standard/native-interop/index.md
index deced08bac0d4..cc746b2975601 100644
--- a/docs/standard/native-interop/index.md
+++ b/docs/standard/native-interop/index.md
@@ -1,7 +1,8 @@
---
title: Native interoperability - .NET
description: Learn how to interface with native components in .NET.
-ms.date: 01/18/2019
+ms.date: 07/08/2026
+ai-usage: ai-assisted
---
# Native interoperability
@@ -24,3 +25,13 @@ The previous list doesn't cover all of the potential situations and scenarios in
- [Type marshalling](type-marshalling.md)
- [Native interoperability best practices](best-practices.md)
- [Disabled runtime marshalling](disabled-marshalling.md)
+
+## COM interop
+
+On Windows, you can also interoperate with Component Object Model (COM) components—both consuming COM components from .NET and exposing .NET components to COM.
+
+- [COM interop overview](cominterop.md)
+- [Expose COM components to .NET](exposing-com-components.md)
+- [Expose .NET components to COM](exposing-dotnet-components-to-com.md)
+- [Interop marshalling](interop-marshalling.md)
+- [How to: Map HRESULTs and exceptions](how-to-map-hresults-and-exceptions.md)
diff --git a/docs/framework/interop/interop-marshalling.md b/docs/standard/native-interop/interop-marshalling.md
similarity index 92%
rename from docs/framework/interop/interop-marshalling.md
rename to docs/standard/native-interop/interop-marshalling.md
index 21dedfb1632b6..6970c5b5ac085 100644
--- a/docs/framework/interop/interop-marshalling.md
+++ b/docs/standard/native-interop/interop-marshalling.md
@@ -1,12 +1,12 @@
---
title: "Interop Marshaling"
description: Get started with interop marshalling, which governs how data is passed in method arguments and return values between managed and unmanaged memory during calls.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "marshaling, COM interop"
- "interop marshalling"
- "interop marshalling, about interop marshalling"
-ms.assetid: 115f7a2f-d422-4605-ab36-13a8dd28142a
---
# Interop Marshaling
@@ -37,7 +37,7 @@ COM also has a marshaller that marshals data between COM apartments or different
### COM Clients and Managed Servers
-An exported managed server with a type library registered by the [Regasm.exe (Assembly Registration Tool)](../tools/regasm-exe-assembly-registration-tool.md) has a `ThreadingModel` registry entry set to `Both`. This value indicates that the server can be activated in a single-threaded apartment (STA) or a multithreaded apartment (MTA). The server object is created in the same apartment as its caller, as shown in the following table:
+An exported managed server with a type library registered by the [Regasm.exe (Assembly Registration Tool)](../../framework/tools/regasm-exe-assembly-registration-tool.md) has a `ThreadingModel` registry entry set to `Both`. This value indicates that the server can be activated in a single-threaded apartment (STA) or a multithreaded apartment (MTA). The server object is created in the same apartment as its caller, as shown in the following table:
|COM client|.NET server|Marshalling requirements|
|----------------|-----------------|-----------------------------|
@@ -117,12 +117,12 @@ Some unmanaged calls can be channeled through SOAP, such as the calls between se
|-----------|-----------------|
|[Default Marshalling Behavior](default-marshalling-behavior.md)|Describes the rules that the interop marshalling service uses to marshal data.|
|[Marshalling Data with Platform Invoke](marshalling-data-with-platform-invoke.md)|Describes how to declare method parameters and pass arguments to functions exported by unmanaged libraries.|
-|[Marshalling Data with COM Interop](marshalling-data-with-com-interop.md)|Describes how to customize COM wrappers to alter marshalling behavior.|
-|[How to: Migrate Managed-Code DCOM to WCF](how-to-migrate-managed-code-dcom-to-wcf.md)|Describes how to migrate from DCOM to WCF.|
-|[How to: Map HRESULTs and Exceptions](how-to-map-hresults-and-exceptions.md)|Describes how to map custom exceptions to HRESULTs and provides the complete mapping from each HRESULT to its comparable exception class in the .NET Framework.|
+|[Marshalling Data with COM Interop](../../framework/interop/marshalling-data-with-com-interop.md)|Describes how to customize COM wrappers to alter marshalling behavior.|
+|[How to: Migrate Managed-Code DCOM to WCF](../../framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md)|Describes how to migrate from DCOM to WCF.|
+|[How to: Map HRESULTs and Exceptions](how-to-map-hresults-and-exceptions.md)|Describes how to map custom exceptions to HRESULTs and provides the complete mapping from each HRESULT to its comparable exception class in .NET.|
|[Interoperating Using Generic Types](/previous-versions/dotnet/netframework-4.0/ms229590(v=vs.100))|Describes which actions are supported when using generic types for COM interoperability.|
|[Interoperating with Unmanaged Code](index.md)|Describes interoperability services provided by the common language runtime.|
-|[Advanced COM Interoperability](/previous-versions/dotnet/netframework-4.0/bd9cdfyx(v=vs.100))|Provides links to more information about incorporating COM components into your .NET Framework application.|
+|[Advanced COM Interoperability](/previous-versions/dotnet/netframework-4.0/bd9cdfyx(v=vs.100))|Provides links to more information about incorporating COM components into your .NET application.|
|[Design Considerations for Interoperation](/previous-versions/dotnet/netframework-4.0/61aax4kh(v=vs.100))|Provides tips for writing integrated COM components.|
## Reference
diff --git a/docs/framework/interop/marshalling-a-delegate-as-a-callback-method.md b/docs/standard/native-interop/marshalling-a-delegate-as-a-callback-method.md
similarity index 97%
rename from docs/framework/interop/marshalling-a-delegate-as-a-callback-method.md
rename to docs/standard/native-interop/marshalling-a-delegate-as-a-callback-method.md
index 9cbea1e5cce93..3ba05ae362aa8 100644
--- a/docs/framework/interop/marshalling-a-delegate-as-a-callback-method.md
+++ b/docs/standard/native-interop/marshalling-a-delegate-as-a-callback-method.md
@@ -1,7 +1,8 @@
---
title: "Marshalling a Delegate as a Callback Method"
description: Learn to marshal a delegate as a callback method. See an example of how to pass delegates to an unmanaged function that's expecting function pointers.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
@@ -9,7 +10,6 @@ dev_langs:
helpviewer_keywords:
- "data marshalling, Callback sample"
- "marshaling, Callback sample"
-ms.assetid: 6ddd7866-9804-4571-84de-83f5cc017a5a
---
# Marshalling a Delegate as a Callback Method
diff --git a/docs/framework/interop/marshalling-classes-structures-and-unions.md b/docs/standard/native-interop/marshalling-classes-structures-and-unions.md
similarity index 98%
rename from docs/framework/interop/marshalling-classes-structures-and-unions.md
rename to docs/standard/native-interop/marshalling-classes-structures-and-unions.md
index 6533079e2d730..adb114bd147eb 100644
--- a/docs/framework/interop/marshalling-classes-structures-and-unions.md
+++ b/docs/standard/native-interop/marshalling-classes-structures-and-unions.md
@@ -1,7 +1,8 @@
---
title: "Marshalling Classes, Structures, and Unions"
description: Review how to marshal classes, structures, and unions. View samples of marshalling classes, structures with nested structures, arrays of structures, and unions.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
@@ -18,11 +19,10 @@ helpviewer_keywords:
- "data marshalling, samples"
- "data marshalling, platform invoke"
- "marshaling, platform invoke"
-ms.assetid: 027832a2-9b43-4fd9-9b45-7f4196261a4e
---
# Marshalling Classes, Structures, and Unions
-Classes and structures are similar in the .NET Framework. Both can have fields, properties, and events. They can also have static and nonstatic methods. One notable difference is that structures are value types and classes are reference types.
+Classes and structures are similar in .NET. Both can have fields, properties, and events. They can also have static and nonstatic methods. One notable difference is that structures are value types and classes are reference types.
The following table lists marshalling options for classes, structures, and unions; describes their usage; and provides a link to the corresponding platform invoke sample.
@@ -96,7 +96,7 @@ The managed `MyPerson`, `MyPerson2`, `MyPerson3`, and `MyArrayStruct` structures
- `MyPerson` contains only string members. The [CharSet](specifying-a-character-set.md) field sets the strings to ANSI format when passed to the unmanaged function.
-- `MyPerson2` contains an `IntPtr` to the `MyPerson` structure. The `IntPtr` type replaces the original pointer to the unmanaged structure because .NET Framework applications do not use pointers unless the code is marked **unsafe**.
+- `MyPerson2` contains an `IntPtr` to the `MyPerson` structure. The `IntPtr` type replaces the original pointer to the unmanaged structure because .NET applications do not use pointers unless the code is marked **unsafe**.
- `MyPerson3` contains `MyPerson` as an embedded structure. A structure embedded within another structure can be flattened by placing the elements of the embedded structure directly into the main structure, or it can be left as an embedded structure, as is done in this sample.
diff --git a/docs/framework/interop/marshalling-data-with-platform-invoke.md b/docs/standard/native-interop/marshalling-data-with-platform-invoke.md
similarity index 90%
rename from docs/framework/interop/marshalling-data-with-platform-invoke.md
rename to docs/standard/native-interop/marshalling-data-with-platform-invoke.md
index 30fcb3b3b9c17..87d7d2ceaeae2 100644
--- a/docs/framework/interop/marshalling-data-with-platform-invoke.md
+++ b/docs/standard/native-interop/marshalling-data-with-platform-invoke.md
@@ -1,7 +1,8 @@
---
title: "Marshalling Data with Platform Invoke"
description: Marshal data with platform invoke in .NET. See a list of data types used in Windows APIs and C-style functions, and find their .NET managed type equivalents.
-ms.date: "03/06/2026"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
@@ -10,12 +11,10 @@ helpviewer_keywords:
- "platform invoke, marshalling data"
- "data marshalling, platform invoke"
- "marshaling, platform invoke"
-ms.assetid: dc5c76cf-7b12-406f-b79c-d1a023ec245d
-ai-usage: ai-assisted
---
# Marshalling Data with Platform Invoke
-To call functions exported from an unmanaged library, a .NET Framework application requires a function prototype in managed code that represents the unmanaged function. To create a prototype that enables platform invoke to marshal data correctly, you must do the following:
+To call functions exported from an unmanaged library, a .NET application requires a function prototype in managed code that represents the unmanaged function. To create a prototype that enables platform invoke to marshal data correctly, you must do the following:
- Apply the attribute to the static function or method in managed code.
@@ -27,7 +26,7 @@ This section provides samples that demonstrate how to create managed function pr
## Platform invoke data types
-The following table lists data types used in the Windows APIs and C-style functions. Many unmanaged libraries contain functions that pass these data types as parameters and return values. The third column lists the corresponding .NET Framework built-in value type or class that you use in managed code. In some cases, you can substitute a type of the same size for the type listed in the table.
+The following table lists data types used in the Windows APIs and C-style functions. Many unmanaged libraries contain functions that pass these data types as parameters and return values. The third column lists the corresponding .NET built-in value type or class that you use in managed code. In some cases, you can substitute a type of the same size for the type listed in the table.
|Unmanaged type in Windows APIs|Unmanaged C language type|Managed type|Description|
|--------------------------------|-------------------------------|------------------------|-----------------|
@@ -51,7 +50,7 @@ The following table lists data types used in the Windows APIs and C-style functi
|`FLOAT`|`float`||32 bits|
|`DOUBLE`|`double`||64 bits|
-For corresponding types in Visual Basic, C#, and C++, see the [Introduction to the .NET Framework Class Library](../../standard/class-library-overview.md#system-namespace).
+For corresponding types in Visual Basic, C#, and C++, see the [Introduction to the .NET class library](../../standard/class-library-overview.md#system-namespace).
## PinvokeLib.dll
diff --git a/docs/framework/interop/marshalling-different-types-of-arrays.md b/docs/standard/native-interop/marshalling-different-types-of-arrays.md
similarity index 98%
rename from docs/framework/interop/marshalling-different-types-of-arrays.md
rename to docs/standard/native-interop/marshalling-different-types-of-arrays.md
index 4e1b436121988..21a2b3419fe1c 100644
--- a/docs/framework/interop/marshalling-different-types-of-arrays.md
+++ b/docs/standard/native-interop/marshalling-different-types-of-arrays.md
@@ -1,14 +1,14 @@
---
title: "Marshalling Different Types of Arrays"
description: Marshal different array types, like integers by value or reference, 2-dimensional integers by value, strings by value, and structures with integers or strings.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
helpviewer_keywords:
- "marshaling, Arrays sample"
- "data marshalling, Arrays sample"
-ms.assetid: c5ac9920-5b6e-4dc9-bf2d-1f6f8ad3b0bf
---
# Marshalling Different Types of Arrays
diff --git a/docs/framework/interop/marshalling-strings.md b/docs/standard/native-interop/marshalling-strings.md
similarity index 76%
rename from docs/framework/interop/marshalling-strings.md
rename to docs/standard/native-interop/marshalling-strings.md
index 50c815084771e..27616c897509a 100644
--- a/docs/framework/interop/marshalling-strings.md
+++ b/docs/standard/native-interop/marshalling-strings.md
@@ -1,8 +1,9 @@
---
title: "Marshalling Strings"
description: Review how to marshal strings. See options for marshalling strings by value or reference, as a result, in a structure or class by value or reference, and more.
-ms.date: "03/30/2017"
-helpviewer_keywords:
+ms.date: 07/08/2026
+ai-usage: ai-assisted
+helpviewer_keywords:
- "marshaling, samples"
- "platform invoke, marshalling data"
- "data marshalling, strings"
@@ -10,28 +11,27 @@ helpviewer_keywords:
- "data marshalling, platform invoke"
- "marshaling. strings"
- "marshaling, platform invoke"
- - "sample applications [.NET Framework], marshalling strings"
-ms.assetid: e21b078b-70fb-4905-be26-c097ab2433ff
+ - "sample applications [.NET], marshalling strings"
---
# Marshalling Strings
-Platform invoke copies string parameters, converting them from the .NET Framework format (Unicode) to the unmanaged format (ANSI), if needed. Because managed strings are immutable, platform invoke does not copy them back from unmanaged memory to managed memory when the function returns.
-
- The following table lists marshalling options for strings, describes their usage, and provides a link to the corresponding .NET Framework sample.
-
-|String|Description|Sample|
-|------------|-----------------|------------|
-|By value.|Passes strings as In parameters.|[MsgBox](msgbox-sample.md)|
-|As result.|Returns strings from unmanaged code.|[Strings](/previous-versions/dotnet/netframework-4.0/e765dyyy(v=vs.100))|
-|By reference.|Passes strings as In/Out parameters using .|[Buffers](/previous-versions/dotnet/netframework-4.0/x3txb6xc(v=vs.100))|
-|In a structure by value.|Passes strings in a structure that is an In parameter.|[Structs](/previous-versions/dotnet/netframework-4.0/eadtsekz(v=vs.100))|
-|In a structure by reference **(char\*)**.|Passes strings in a structure that is an In/Out parameter. The unmanaged function expects a pointer to a character buffer and the buffer size is a member of the structure.|[Strings](/previous-versions/dotnet/netframework-4.0/e765dyyy(v=vs.100))|
-|In a structure by reference **(char[])**.|Passes strings in a structure that is an In/Out parameter. The unmanaged function expects an embedded character buffer.|[OSInfo](/previous-versions/dotnet/netframework-4.0/795sy883(v=vs.100))|
-|In a class by value **(char\*)**.|Passes strings in a class (a class is an In/Out parameter). The unmanaged function expects a pointer to a character buffer.|[OpenFileDlg](/previous-versions/dotnet/netframework-4.0/w5tyztk9(v=vs.100))|
-|In a class by value **(char[])**.|Passes strings in a class (a class is an In/Out parameter). The unmanaged function expects an embedded character buffer.|[OSInfo](/previous-versions/dotnet/netframework-4.0/795sy883(v=vs.100))|
-|As an array of strings by value.|Creates an array of strings that is passed by value.|[Arrays](marshalling-different-types-of-arrays.md)|
-|As an array of structures that contain strings by value.|Creates an array of structures that contain strings and the array is passed by value.|[Arrays](marshalling-different-types-of-arrays.md)|
-
+Platform invoke copies string parameters, converting them from the .NET string format (Unicode) to the unmanaged format (ANSI), if needed. Because managed strings are immutable, platform invoke does not copy them back from unmanaged memory to managed memory when the function returns.
+
+ The following table lists marshalling options for strings, describes their usage, and provides a link to the corresponding .NET sample.
+
+|String|Description|Sample|
+|------------|-----------------|------------|
+|By value.|Passes strings as In parameters.|[MsgBox](msgbox-sample.md)|
+|As result.|Returns strings from unmanaged code.|[Strings](/previous-versions/dotnet/netframework-4.0/e765dyyy(v=vs.100))|
+|By reference.|Passes strings as In/Out parameters using .|[Buffers](/previous-versions/dotnet/netframework-4.0/x3txb6xc(v=vs.100))|
+|In a structure by value.|Passes strings in a structure that is an In parameter.|[Structs](/previous-versions/dotnet/netframework-4.0/eadtsekz(v=vs.100))|
+|In a structure by reference **(char\*)**.|Passes strings in a structure that is an In/Out parameter. The unmanaged function expects a pointer to a character buffer and the buffer size is a member of the structure.|[Strings](/previous-versions/dotnet/netframework-4.0/e765dyyy(v=vs.100))|
+|In a structure by reference **(char[])**.|Passes strings in a structure that is an In/Out parameter. The unmanaged function expects an embedded character buffer.|[OSInfo](/previous-versions/dotnet/netframework-4.0/795sy883(v=vs.100))|
+|In a class by value **(char\*)**.|Passes strings in a class (a class is an In/Out parameter). The unmanaged function expects a pointer to a character buffer.|[OpenFileDlg](/previous-versions/dotnet/netframework-4.0/w5tyztk9(v=vs.100))|
+|In a class by value **(char[])**.|Passes strings in a class (a class is an In/Out parameter). The unmanaged function expects an embedded character buffer.|[OSInfo](/previous-versions/dotnet/netframework-4.0/795sy883(v=vs.100))|
+|As an array of strings by value.|Creates an array of strings that is passed by value.|[Arrays](marshalling-different-types-of-arrays.md)|
+|As an array of structures that contain strings by value.|Creates an array of structures that contain strings and the array is passed by value.|[Arrays](marshalling-different-types-of-arrays.md)|
+
## See also
- [Default Marshalling for Strings](default-marshalling-for-strings.md)
diff --git a/docs/framework/interop/media/callback-functions/platform-invoke-callback-process.gif b/docs/standard/native-interop/media/callback-functions/platform-invoke-callback-process.gif
similarity index 100%
rename from docs/framework/interop/media/callback-functions/platform-invoke-callback-process.gif
rename to docs/standard/native-interop/media/callback-functions/platform-invoke-callback-process.gif
diff --git a/docs/framework/interop/media/consuming-unmanaged-dll-functions/platform-invoke-call.gif b/docs/standard/native-interop/media/consuming-unmanaged-dll-functions/platform-invoke-call.gif
similarity index 100%
rename from docs/framework/interop/media/consuming-unmanaged-dll-functions/platform-invoke-call.gif
rename to docs/standard/native-interop/media/consuming-unmanaged-dll-functions/platform-invoke-call.gif
diff --git a/docs/framework/interop/media/copying-and-pinning/interop-marshal-copy.gif b/docs/standard/native-interop/media/copying-and-pinning/interop-marshal-copy.gif
similarity index 100%
rename from docs/framework/interop/media/copying-and-pinning/interop-marshal-copy.gif
rename to docs/standard/native-interop/media/copying-and-pinning/interop-marshal-copy.gif
diff --git a/docs/framework/interop/media/copying-and-pinning/interop-marshal-reference-pin.gif b/docs/standard/native-interop/media/copying-and-pinning/interop-marshal-reference-pin.gif
similarity index 100%
rename from docs/framework/interop/media/copying-and-pinning/interop-marshal-reference-pin.gif
rename to docs/standard/native-interop/media/copying-and-pinning/interop-marshal-reference-pin.gif
diff --git a/docs/framework/interop/media/default-marshaling-for-objects/interop-variant-passed-value-reference.gif b/docs/standard/native-interop/media/default-marshaling-for-objects/interop-variant-passed-value-reference.gif
similarity index 100%
rename from docs/framework/interop/media/default-marshaling-for-objects/interop-variant-passed-value-reference.gif
rename to docs/standard/native-interop/media/default-marshaling-for-objects/interop-variant-passed-value-reference.gif
diff --git a/docs/framework/interop/media/deploying-an-interop-application/com-private-deployment.gif b/docs/standard/native-interop/media/deploying-an-interop-application/com-private-deployment.gif
similarity index 100%
rename from docs/framework/interop/media/deploying-an-interop-application/com-private-deployment.gif
rename to docs/standard/native-interop/media/deploying-an-interop-application/com-private-deployment.gif
diff --git a/docs/framework/interop/media/interop-marshaling/interop-and-com-marshaling.gif b/docs/standard/native-interop/media/interop-marshaling/interop-and-com-marshaling.gif
similarity index 100%
rename from docs/framework/interop/media/interop-marshaling/interop-and-com-marshaling.gif
rename to docs/standard/native-interop/media/interop-marshaling/interop-and-com-marshaling.gif
diff --git a/docs/framework/interop/media/interop-marshaling/interop-direct-ref-across-process.gif b/docs/standard/native-interop/media/interop-marshaling/interop-direct-ref-across-process.gif
similarity index 100%
rename from docs/framework/interop/media/interop-marshaling/interop-direct-ref-across-process.gif
rename to docs/standard/native-interop/media/interop-marshaling/interop-direct-ref-across-process.gif
diff --git a/docs/framework/interop/media/interop-marshaling/interop-heaps-managed-and-unmanaged.gif b/docs/standard/native-interop/media/interop-marshaling/interop-heaps-managed-and-unmanaged.gif
similarity index 100%
rename from docs/framework/interop/media/interop-marshaling/interop-heaps-managed-and-unmanaged.gif
rename to docs/standard/native-interop/media/interop-marshaling/interop-heaps-managed-and-unmanaged.gif
diff --git a/docs/framework/interop/media/interop-marshaling/interop-marshaling-invoke-and-com.png b/docs/standard/native-interop/media/interop-marshaling/interop-marshaling-invoke-and-com.png
similarity index 100%
rename from docs/framework/interop/media/interop-marshaling/interop-marshaling-invoke-and-com.png
rename to docs/standard/native-interop/media/interop-marshaling/interop-marshaling-invoke-and-com.png
diff --git a/docs/framework/interop/media/interop-marshaling/interop-remote-soap-or-tcp.gif b/docs/standard/native-interop/media/interop-marshaling/interop-remote-soap-or-tcp.gif
similarity index 100%
rename from docs/framework/interop/media/interop-marshaling/interop-remote-soap-or-tcp.gif
rename to docs/standard/native-interop/media/interop-marshaling/interop-remote-soap-or-tcp.gif
diff --git a/docs/framework/interop/media/interop-marshaling/single-process-across-multi-apartment.gif b/docs/standard/native-interop/media/interop-marshaling/single-process-across-multi-apartment.gif
similarity index 100%
rename from docs/framework/interop/media/interop-marshaling/single-process-across-multi-apartment.gif
rename to docs/standard/native-interop/media/interop-marshaling/single-process-across-multi-apartment.gif
diff --git a/docs/framework/interop/msgbox-sample.md b/docs/standard/native-interop/msgbox-sample.md
similarity index 97%
rename from docs/framework/interop/msgbox-sample.md
rename to docs/standard/native-interop/msgbox-sample.md
index 253f5307f54ba..c07c1b6edbde4 100644
--- a/docs/framework/interop/msgbox-sample.md
+++ b/docs/standard/native-interop/msgbox-sample.md
@@ -1,7 +1,8 @@
---
title: "MsgBox Sample"
description: See a sample of passing string types by values as In parameters using MsgBox. It shows when to use the EntryPoint, CharSet, and ExactSpelling fields in .NET.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
@@ -9,7 +10,6 @@ dev_langs:
helpviewer_keywords:
- "marshaling, MsgBox sample"
- "data marshalling, MsgBox sample"
-ms.assetid: 9e0edff6-cc0d-4d5c-a445-aecf283d9c3a
---
# MsgBox Sample
diff --git a/docs/framework/interop/packaging-an-assembly-for-com.md b/docs/standard/native-interop/packaging-an-assembly-for-com.md
similarity index 60%
rename from docs/framework/interop/packaging-an-assembly-for-com.md
rename to docs/standard/native-interop/packaging-an-assembly-for-com.md
index 1420849f09f49..9921afd497084 100644
--- a/docs/framework/interop/packaging-an-assembly-for-com.md
+++ b/docs/standard/native-interop/packaging-an-assembly-for-com.md
@@ -1,9 +1,10 @@
---
-title: "Packaging a .NET Framework Assembly for COM"
+title: "Package a .NET Framework assembly for COM"
description: Package a .NET assembly for COM. Gather the list of types that COM applications can consume, versioning and deployment instructions, and the type library.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- - "exposing .NET Framework components to COM"
+ - "exposing .NET components to COM"
- "COM interop, packaging assemblies"
- "packaging assemblies for COM"
- "Tlbexp.exe"
@@ -12,19 +13,21 @@ helpviewer_keywords:
- "Assembly Registration tool"
- "Type Library Exporter"
- "Reqsvcs.exe"
- - "interoperation with unmanaged code, exposing .NET Framework components"
+ - "interoperation with unmanaged code, exposing .NET components"
- "interoperation with unmanaged code, packaging assemblies"
- "COM interop, exposing COM components"
- "Reqasm.exe"
-ms.assetid: 39dc55aa-f2a1-4093-87bb-f1c0edb6e761
---
-# Packaging a .NET Framework Assembly for COM
+# Package a .NET Framework assembly for COM
+
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses legacy tools and deployment models, such as Tlbexp.exe, Regasm.exe, Regsvcs.exe, the global assembly cache, and registry-based COM registration. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
COM developers can benefit from the following information about the managed types they plan to incorporate in their application:
- A list of types that COM applications can consume
- Some managed types are invisible to COM; some are visible but not creatable; and some are both visible and creatable. An assembly can comprise any combination of invisible, visible, not creatable, and creatable types. For completeness, identify the types in an assembly that you intend to expose to COM, especially when those types are a subset of the types exposed to the .NET Framework.
+ Some managed types are invisible to COM; some are visible but not creatable; and some are both visible and creatable. An assembly can comprise any combination of invisible, visible, not creatable, and creatable types. For completeness, identify the types in an assembly that you intend to expose to COM, especially when those types are a subset of the types exposed to .NET.
For additional information, see [Qualifying .NET Types for Interoperation](../../standard/native-interop/qualify-net-types-for-interoperation.md).
@@ -36,7 +39,7 @@ COM developers can benefit from the following information about the managed type
- Deployment instructions
- Strong-named assemblies that are signed by a publisher can be installed into the global assembly cache. Unsigned assemblies must be installed on the user's machine as private assemblies.
+ For .NET Framework, strong-named assemblies that are signed by a publisher can be installed into the global assembly cache. Unsigned assemblies must be installed on the user's machine as private assemblies.
For additional information, see [Assembly Security Considerations](../../standard/assembly/security-considerations.md).
@@ -60,7 +63,7 @@ For instructions, see [How to: Embed Type Libraries as Win32 Resources in .NET-B
## Type Library Exporter
-The [Type Library Exporter (Tlbexp.exe)](../tools/tlbexp-exe-type-library-exporter.md) is a command-line tool that converts the classes and interfaces contained in an assembly to a COM type library. Once the type information of the class is available, COM clients can create an instance of the .NET class and call the methods of the instance, just as if it were a COM object. Tlbexp.exe converts an entire assembly at one time. You cannot use Tlbexp.exe to generate type information for a subset of the types defined in an assembly.
+The [Type Library Exporter (Tlbexp.exe)](../../framework/tools/tlbexp-exe-type-library-exporter.md) is a command-line tool that converts the classes and interfaces contained in an assembly to a COM type library. Once the type information of the class is available, COM clients can create an instance of the .NET class and call the methods of the instance, just as if it were a COM object. Tlbexp.exe converts an entire assembly at one time. You cannot use Tlbexp.exe to generate type information for a subset of the types defined in an assembly.
@@ -74,22 +77,22 @@ The **TypeLibConverter class** implements the
## .NET Services Installation Tool
-The [.NET Services Installation Tool (Regsvcs.exe)](../tools/regsvcs-exe-net-services-installation-tool.md) adds managed classes to Windows 2000 Component Services and combines several tasks within a single tool. In addition to loading and registering an assembly, Regsvcs.exe can generate, register, and install the type library into an existing COM+ 1.0 application.
+The [.NET Services Installation Tool (Regsvcs.exe)](../../framework/tools/regsvcs-exe-net-services-installation-tool.md) adds managed classes to Windows 2000 Component Services and combines several tasks within a single tool. In addition to loading and registering an assembly, Regsvcs.exe can generate, register, and install the type library into an existing COM+ 1.0 application.
## See also
-
-
-- [Exposing .NET Framework Components to COM](exposing-dotnet-components-to-com.md)
+- [Expose .NET components to COM](exposing-dotnet-components-to-com.md)
- [Qualifying .NET Types for Interoperation](../../standard/native-interop/qualify-net-types-for-interoperation.md)
- [Introducing the class interface](../../standard/native-interop/com-callable-wrapper.md#introducing-the-class-interface)
- [Assembly Security Considerations](../../standard/assembly/security-considerations.md)
-- [Tlbexp.exe (Type Library Exporter)](../tools/tlbexp-exe-type-library-exporter.md)
-- [Registering Assemblies with COM](registering-assemblies-with-com.md)
+- [Tlbexp.exe (Type Library Exporter)](../../framework/tools/tlbexp-exe-type-library-exporter.md)
+- [Register .NET Framework assemblies with COM](registering-assemblies-with-com.md)
- [How to: Embed Type Libraries as Win32 Resources in Applications](/previous-versions/dotnet/netframework-4.0/ww9a897z(v=vs.100))
diff --git a/docs/framework/interop/passing-structures.md b/docs/standard/native-interop/passing-structures.md
similarity index 99%
rename from docs/framework/interop/passing-structures.md
rename to docs/standard/native-interop/passing-structures.md
index 8fdc6bf9a429b..cf7faa39f108f 100644
--- a/docs/framework/interop/passing-structures.md
+++ b/docs/standard/native-interop/passing-structures.md
@@ -1,13 +1,13 @@
---
title: "Passing Structures"
description: Understand how to pass structures and classes to unmanaged functions. Learn about the StructLayoutAttribute attribute, which you use to define formatted types.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
helpviewer_keywords:
- "platform invoke, calling unmanaged functions"
-ms.assetid: 9b92ac73-32b7-4e1b-862e-6d8d950cf169
---
# Passing Structures
diff --git a/docs/framework/interop/platform-invoke-examples.md b/docs/standard/native-interop/platform-invoke-examples.md
similarity index 92%
rename from docs/framework/interop/platform-invoke-examples.md
rename to docs/standard/native-interop/platform-invoke-examples.md
index 76da7ff5d19eb..f14fc784c149c 100644
--- a/docs/framework/interop/platform-invoke-examples.md
+++ b/docs/standard/native-interop/platform-invoke-examples.md
@@ -1,19 +1,19 @@
---
title: "Platform Invoke Examples"
description: See a platform invoke example that demonstrates how to define and call the MessageBox function in User32.dll.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
- "cpp"
helpviewer_keywords:
- - "examples [.NET Framework], platform invoke"
+ - "examples [.NET], platform invoke"
- "unmanaged functions"
- "COM interop, platform invoke"
- "platform invoke, examples"
- "interoperation with unmanaged code, platform invoke"
- "DLL functions"
-ms.assetid: 15926806-f0b7-487e-93a6-4e9367ec689f
---
# Platform Invoke Examples
diff --git a/docs/standard/native-interop/qualify-net-types-for-interoperation.md b/docs/standard/native-interop/qualify-net-types-for-interoperation.md
index d9dcd4cb35fc4..250ce52454acb 100644
--- a/docs/standard/native-interop/qualify-net-types-for-interoperation.md
+++ b/docs/standard/native-interop/qualify-net-types-for-interoperation.md
@@ -9,7 +9,6 @@ helpviewer_keywords:
- "interoperation with unmanaged code, qualifying .NET types"
- "interoperation with unmanaged code, exposing .NET components"
- "COM interop, exposing COM components"
-ms.assetid: 4b8afb52-fb8d-4e65-b47c-fd82956a3cdd
---
# Qualify .NET types for COM interoperation
@@ -274,7 +273,7 @@ As you can see, these tables match the C++ example, so these interfaces will fun
-
-
-- [Expose .NET Framework components to COM](../../framework/interop/exposing-dotnet-components-to-com.md)
+- [Expose .NET Framework components to COM](exposing-dotnet-components-to-com.md)
- [Introducing the class interface](com-callable-wrapper.md#introducing-the-class-interface)
- [Apply interop attributes](apply-interop-attributes.md)
-- [Package a .NET Framework assembly for COM](../../framework/interop/packaging-an-assembly-for-com.md)
+- [Package a .NET Framework assembly for COM](packaging-an-assembly-for-com.md)
diff --git a/docs/framework/interop/registering-assemblies-with-com.md b/docs/standard/native-interop/registering-assemblies-with-com.md
similarity index 56%
rename from docs/framework/interop/registering-assemblies-with-com.md
rename to docs/standard/native-interop/registering-assemblies-with-com.md
index 5730e90de5b64..1f2e542360ac4 100644
--- a/docs/framework/interop/registering-assemblies-with-com.md
+++ b/docs/standard/native-interop/registering-assemblies-with-com.md
@@ -1,19 +1,22 @@
---
-title: "Registering Assemblies with COM"
+title: "Register .NET Framework assemblies with COM"
description: Register or unregister assemblies with COM using the Assembly Registration Tool (Regasm.exe), which adds information about the class to the system registry.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "COM interop, registering assemblies"
- "unregistering assemblies"
- "interoperation with unmanaged code, registering assemblies"
- "registering assemblies"
-ms.assetid: 87925795-a3ae-4833-b138-125413478551
---
-# Registering Assemblies with COM
+# Register .NET Framework assemblies with COM
-You can run a command-line tool called the [Assembly Registration Tool (Regasm.exe)](../tools/regasm-exe-assembly-registration-tool.md) to register or unregister an assembly for use with COM. Regasm.exe adds information about the class to the system registry so COM clients can use the .NET Framework class transparently. The class provides the equivalent functionality.
+> [!NOTE]
+> This article describes .NET Framework COM interop guidance that uses the legacy Assembly Registration Tool (Regasm.exe), the global assembly cache, and registry-based COM registration. For modern .NET, use [COM source generation](comwrappers-source-generation.md) or the API. For more information, see [COM interop](cominterop.md).
- A managed component must be registered in the Windows registry before it can be activated from a COM client. The following table shows the keys that Regasm.exe typically adds to the Windows registry. (000000 indicates the actual GUID value.)
+You can run a command-line tool called the [Assembly Registration Tool (Regasm.exe)](../../framework/tools/regasm-exe-assembly-registration-tool.md) to register or unregister a .NET Framework assembly for use with COM. Regasm.exe adds information about the class to the system registry so COM clients can use the .NET Framework class transparently. The class provides the equivalent functionality.
+
+ For .NET Framework, a managed component must be registered in the Windows registry before it can be activated from a COM client. The following table shows the keys that Regasm.exe typically adds to the Windows registry. (000000 indicates the actual GUID value.)
|GUID|Description|Registry key|
|----------|-----------------|------------------|
@@ -32,15 +35,15 @@ You can run a command-line tool called the [Assembly Registration Tool (Regasm.e
Regasm.exe also creates the InProcServer32 key under the HKCR\CLSID\\{0000…0000} key. The default value for the key is set to the name of the DLL that initializes the common language runtime (Mscoree.dll).
-## Examining Registry Entries
+## Examine registry entries
- COM interop provides a standard class factory implementation to create an instance of any .NET Framework class. Clients can call `DllGetClassObject` on the managed DLL to get a class factory and create objects, just as they would with any other COM component.
+ COM interop in .NET Framework provides a standard class factory implementation to create an instance of any .NET Framework class. Clients can call `DllGetClassObject` on the managed DLL to get a class factory and create objects, just as they would with any other COM component.
For the `InprocServer32` subkey, a reference to Mscoree.dll appears in place of a traditional COM type library to indicate that the common language runtime creates the managed object.
## See also
-- [Exposing .NET Framework Components to COM](exposing-dotnet-components-to-com.md)
-- [How to: Reference .NET Types from COM](how-to-reference-net-types-from-com.md)
+- [Expose .NET components to COM](exposing-dotnet-components-to-com.md)
+- [Reference .NET types from COM](how-to-reference-net-types-from-com.md)
- [Calling a .NET Object](/previous-versions/dotnet/netframework-4.0/8hw8h46b(v=vs.100))
- [Deploying an Application for COM Access](/previous-versions/dotnet/netframework-4.0/c2850st8(v=vs.100))
diff --git a/docs/standard/native-interop/runtime-callable-wrapper.md b/docs/standard/native-interop/runtime-callable-wrapper.md
index fc02c1119240b..61e93a100792c 100644
--- a/docs/standard/native-interop/runtime-callable-wrapper.md
+++ b/docs/standard/native-interop/runtime-callable-wrapper.md
@@ -2,60 +2,59 @@
title: "Runtime Callable Wrapper"
description: The CLR exposes COM objects through a runtime callable wrapper, which manages calls between a .NET client and a COM object.
ms.date: "03/30/2017"
-helpviewer_keywords:
+helpviewer_keywords:
- "COM interop, COM wrappers"
- "RCW"
- "COM wrappers"
- "runtime callable wrappers"
- "interoperation with unmanaged code, COM wrappers"
-ms.assetid: 7e542583-1e31-4e10-b523-8cf2f29cb4a4
---
# Runtime Callable Wrapper
-The common language runtime exposes COM objects through a proxy called the runtime callable wrapper (RCW). Although the RCW appears to be an ordinary object to .NET clients, its primary function is to marshal calls between a .NET client and a COM object.
-
- The runtime creates exactly one RCW for each COM object, regardless of the number of references that exist on that object. The runtime maintains a single RCW per process for each object. If you create an RCW in one application domain or apartment, and then pass a reference to another application domain or apartment, a proxy to the first object will be used. Note that this proxy is a new managed object and not the same as the initial RCW; this means the two managed objects are not equal but do represent the same COM object. As the following illustration shows, any number of managed clients can hold a reference to the COM objects that expose `INew` and `INewer` interfaces.
+The common language runtime exposes COM objects through a proxy called the runtime callable wrapper (RCW). Although the RCW appears to be an ordinary object to .NET clients, its primary function is to marshal calls between a .NET client and a COM object.
+
+ The runtime creates exactly one RCW for each COM object, regardless of the number of references that exist on that object. The runtime maintains a single RCW per process for each object. If you create an RCW in one application domain or apartment, and then pass a reference to another application domain or apartment, a proxy to the first object will be used. Note that this proxy is a new managed object and not the same as the initial RCW; this means the two managed objects are not equal but do represent the same COM object. As the following illustration shows, any number of managed clients can hold a reference to the COM objects that expose `INew` and `INewer` interfaces.
The following image shows the process for accessing COM objects through the runtime callable wrapper:
- 
+ 
+
+ Using metadata derived from a type library, the runtime creates both the COM object being called and a wrapper for that object. Each RCW maintains a cache of interface pointers on the COM object it wraps and releases its reference on the COM object when the RCW is no longer needed. The runtime performs garbage collection on the RCW.
+
+ Among other activities, the RCW marshals data between managed and unmanaged code, on behalf of the wrapped object. Specifically, the RCW provides marshalling for method arguments and method return values whenever the client and server have different representations of the data passed between them.
- Using metadata derived from a type library, the runtime creates both the COM object being called and a wrapper for that object. Each RCW maintains a cache of interface pointers on the COM object it wraps and releases its reference on the COM object when the RCW is no longer needed. The runtime performs garbage collection on the RCW.
-
- Among other activities, the RCW marshals data between managed and unmanaged code, on behalf of the wrapped object. Specifically, the RCW provides marshalling for method arguments and method return values whenever the client and server have different representations of the data passed between them.
-
The standard wrapper enforces built-in marshalling rules. For example, when a .NET client passes a `string` type as part of an argument to an unmanaged object, the wrapper converts the `string` to a `BSTR` type. Should the COM object return a `BSTR` to its managed caller, the caller receives a `string`. Both the client and the server send and receive data that is familiar to them. Other types require no conversion. For instance, a standard wrapper will always pass a 4-byte integer between managed and unmanaged code without converting the type.
-
-## Marshalling selected interfaces
+
+## Marshalling selected interfaces
The primary goal of the runtime callable wrapper (RCW) is to hide the differences between the managed and unmanaged programming models. To create a seamless transition, the RCW consumes selected COM interfaces without exposing them to the .NET client, as shown in the following illustration.
The following image shows COM interfaces and the runtime callable wrapper:
-
- 
-
- When created as an early-bound object, the RCW is a specific type. It implements the interfaces that the COM object implements and exposes the methods, properties, and events from the object's interfaces. In the illustration, the RCW exposes the INew interface but consumes the **IUnknown** and **IDispatch** interfaces. Further, the RCW exposes all members of the INew interface to the .NET client.
-
- The RCW consumes the interfaces listed in the following table, which are exposed by the object it wraps.
-
-|Interface|Description|
-|---------------|-----------------|
-|**IDispatch**|For late binding to COM objects through reflection.|
-|**IErrorInfo**|Provides a textual description of the error, its source, a Help file, Help context, and the GUID of the interface that defined the error (always **GUID_NULL** for .NET classes).|
-|**IProvideClassInfo**|If the COM object being wrapped implements **IProvideClassInfo**, the RCW extracts the type information from this interface to provide better type identity.|
-|**IUnknown**|For object identity, type coercion, and lifetime management:
- Object identity The runtime distinguishes between COM objects by comparing the value of the **IUnknown** interface for each object. - Type coercion The RCW recognizes the dynamic type discovery performed by the **QueryInterface** method. - Lifetime management Using the **QueryInterface** method, the RCW gets and holds a reference to an unmanaged object until the runtime performs garbage collection on the wrapper, which releases the unmanaged object.|
-
- The RCW optionally consumes the interfaces listed in the following table, which are exposed by the object it wraps.
-
-|Interface|Description|
-|---------------|-----------------|
-|**IConnectionPoint** and **IConnectionPointContainer**|The RCW converts objects that expose the connection-point event style to delegate-based events.|
-|**IDispatchEx** (.NET Framework Only) |If the class implements **IDispatchEx**, the RCW implements **IExpando**. The **IDispatchEx** interface is an extension of the **IDispatch** interface that, unlike **IDispatch**, enables enumeration, addition, deletion, and case-sensitive calling of members.|
-|**IEnumVARIANT**|Enables COM types that support enumerations to be treated as collections.|
-
+
+ 
+
+ When created as an early-bound object, the RCW is a specific type. It implements the interfaces that the COM object implements and exposes the methods, properties, and events from the object's interfaces. In the illustration, the RCW exposes the INew interface but consumes the **IUnknown** and **IDispatch** interfaces. Further, the RCW exposes all members of the INew interface to the .NET client.
+
+ The RCW consumes the interfaces listed in the following table, which are exposed by the object it wraps.
+
+|Interface|Description|
+|---------------|-----------------|
+|**IDispatch**|For late binding to COM objects through reflection.|
+|**IErrorInfo**|Provides a textual description of the error, its source, a Help file, Help context, and the GUID of the interface that defined the error (always **GUID_NULL** for .NET classes).|
+|**IProvideClassInfo**|If the COM object being wrapped implements **IProvideClassInfo**, the RCW extracts the type information from this interface to provide better type identity.|
+|**IUnknown**|For object identity, type coercion, and lifetime management:
- Object identity The runtime distinguishes between COM objects by comparing the value of the **IUnknown** interface for each object. - Type coercion The RCW recognizes the dynamic type discovery performed by the **QueryInterface** method. - Lifetime management Using the **QueryInterface** method, the RCW gets and holds a reference to an unmanaged object until the runtime performs garbage collection on the wrapper, which releases the unmanaged object.|
+
+ The RCW optionally consumes the interfaces listed in the following table, which are exposed by the object it wraps.
+
+|Interface|Description|
+|---------------|-----------------|
+|**IConnectionPoint** and **IConnectionPointContainer**|The RCW converts objects that expose the connection-point event style to delegate-based events.|
+|**IDispatchEx** (.NET Framework Only) |If the class implements **IDispatchEx**, the RCW implements **IExpando**. The **IDispatchEx** interface is an extension of the **IDispatch** interface that, unlike **IDispatch**, enables enumeration, addition, deletion, and case-sensitive calling of members.|
+|**IEnumVARIANT**|Enables COM types that support enumerations to be treated as collections.|
+
## See also
- [COM Wrappers](com-wrappers.md)
- [COM Callable Wrapper](com-callable-wrapper.md)
- [Type Library to Assembly Conversion Summary](/previous-versions/dotnet/netframework-4.0/k83zzh38(v=vs.100))
-- [Importing a Type Library as an Assembly](../../framework/interop/importing-a-type-library-as-an-assembly.md)
+- [Importing a Type Library as an Assembly](importing-a-type-library-as-an-assembly.md)
diff --git a/docs/framework/interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/NativeMethods.cs b/docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/NativeMethods.cs
similarity index 100%
rename from docs/framework/interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/NativeMethods.cs
rename to docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/NativeMethods.cs
diff --git a/docs/framework/interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/PInvokeLibManaged.csproj b/docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/PInvokeLibManaged.csproj
similarity index 100%
rename from docs/framework/interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/PInvokeLibManaged.csproj
rename to docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/PInvokeLibManaged.csproj
diff --git a/docs/framework/interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/Program.cs b/docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/Program.cs
similarity index 100%
rename from docs/framework/interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/Program.cs
rename to docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/csharp/PInvokeLibManaged/Program.cs
diff --git a/docs/framework/interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/NativeMethods.vb b/docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/NativeMethods.vb
similarity index 100%
rename from docs/framework/interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/NativeMethods.vb
rename to docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/NativeMethods.vb
diff --git a/docs/framework/interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/PInvokeLibManaged.vbproj b/docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/PInvokeLibManaged.vbproj
similarity index 100%
rename from docs/framework/interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/PInvokeLibManaged.vbproj
rename to docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/PInvokeLibManaged.vbproj
diff --git a/docs/framework/interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/Program.vb b/docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/Program.vb
similarity index 100%
rename from docs/framework/interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/Program.vb
rename to docs/standard/native-interop/snippets/marshalling-data-with-platform-invoke/vb/PInvokeLibManaged/Program.vb
diff --git a/docs/framework/interop/specifying-a-character-set.md b/docs/standard/native-interop/specifying-a-character-set.md
similarity index 98%
rename from docs/framework/interop/specifying-a-character-set.md
rename to docs/standard/native-interop/specifying-a-character-set.md
index e1b4403dd567f..1ecad1aacac20 100644
--- a/docs/framework/interop/specifying-a-character-set.md
+++ b/docs/standard/native-interop/specifying-a-character-set.md
@@ -1,7 +1,8 @@
---
title: "Specifying a Character Set"
description: Learn how to specify a character set that uses narrow (ANSI) or wide (Unicode) encoding. You can alternatively specify automatic runtime selection.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
dev_langs:
- "csharp"
- "vb"
@@ -10,7 +11,6 @@ helpviewer_keywords:
- "platform invoke, attribute fields"
- "attribute fields in platform invoke, CharSet"
- "CharSet field"
-ms.assetid: a8347eb1-295f-46b9-8a78-63331f9ecc50
---
# Specify a character set
diff --git a/docs/framework/interop/specifying-an-entry-point.md b/docs/standard/native-interop/specifying-an-entry-point.md
similarity index 98%
rename from docs/framework/interop/specifying-an-entry-point.md
rename to docs/standard/native-interop/specifying-an-entry-point.md
index 0fe98c55079b5..302a70312f44d 100644
--- a/docs/framework/interop/specifying-an-entry-point.md
+++ b/docs/standard/native-interop/specifying-an-entry-point.md
@@ -1,12 +1,12 @@
---
title: "Specifying an Entry Point"
description: Learn to specify an entry point, which identifies a function's location in a DLL. You can rename the function by mapping the entry point to another name.
-ms.date: "03/30/2017"
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "EntryPoint field"
- "platform invoke, attribute fields"
- "attribute fields in platform invoke, EntryPoint"
-ms.assetid: d1247f08-0965-416a-b978-e0b50652dfe3
---
# Specifying an Entry Point
diff --git a/docs/framework/interop/type-equivalence-and-embedded-interop-types.md b/docs/standard/native-interop/type-equivalence-and-embedded-interop-types.md
similarity index 82%
rename from docs/framework/interop/type-equivalence-and-embedded-interop-types.md
rename to docs/standard/native-interop/type-equivalence-and-embedded-interop-types.md
index eec7512ebee46..148add67cd457 100644
--- a/docs/framework/interop/type-equivalence-and-embedded-interop-types.md
+++ b/docs/standard/native-interop/type-equivalence-and-embedded-interop-types.md
@@ -1,17 +1,17 @@
---
title: "Type equivalence and embedded interop types"
-description: Understand type equivalence between .NET types and members with a managed assembly, and COM types that are embedded into that assembly. For .NET 4 and above.
-ms.date: "03/30/2017"
+description: Understand type equivalence between .NET types and members with a managed assembly, and COM types that are embedded into that assembly. Available in .NET; introduced in .NET Framework 4.
+ms.date: 07/08/2026
+ai-usage: ai-assisted
helpviewer_keywords:
- "type equivalence"
- "embedded interop types"
- "primary interop assemblies,not necessary in CLR version 4"
- "NoPIA"
-ms.assetid: 78892eba-2a58-4165-b4b1-0250ee2f41dc
---
# Type equivalence and embedded interop types
-Beginning with the .NET Framework 4, the common language runtime supports embedding type information for COM types directly into managed assemblies, instead of requiring the managed assemblies to obtain type information for COM types from interop assemblies. Because the embedded type information includes only the types and members that are actually used by a managed assembly, two managed assemblies might have very different views of the same COM type. Each managed assembly has a different object to represent its view of the COM type. The common language runtime supports type equivalence between these different views for interfaces, structures, enumerations, and delegates.
+In .NET, the common language runtime supports embedding type information for COM types directly into managed assemblies, instead of requiring the managed assemblies to obtain type information for COM types from interop assemblies. Because the embedded type information includes only the types and members that are actually used by a managed assembly, two managed assemblies might have very different views of the same COM type. Each managed assembly has a different object to represent its view of the COM type. The common language runtime supports type equivalence between these different views for interfaces, structures, enumerations, and delegates.
Type equivalence means that a COM object that is passed from one managed assembly to another can be cast to the appropriate managed type in the receiving assembly.
diff --git a/docs/standard/security/impersonating-and-reverting.md b/docs/standard/security/impersonating-and-reverting.md
index c8150e2ebe8c0..7423d68bea161 100644
--- a/docs/standard/security/impersonating-and-reverting.md
+++ b/docs/standard/security/impersonating-and-reverting.md
@@ -22,7 +22,7 @@ Sometimes you might need to obtain a Windows account token to impersonate a Wind
In situations where your application must impersonate a Windows account that has not been attached to the current thread by IIS, you must retrieve that account's token and use it to activate the account. You can do this by performing the following tasks:
-1. Retrieve an account token for a particular user by making a call to the unmanaged **LogonUser** method. This method is not in the .NET base class library, but is located in the unmanaged **advapi32.dll**. Accessing methods in unmanaged code is an advanced operation and is beyond the scope of this discussion. For more information, see [Interoperating with Unmanaged Code](../../framework/interop/index.md). For more information about the **LogonUser** method and **advapi32.dll**, see the Platform SDK documentation.
+1. Retrieve an account token for a particular user by making a call to the unmanaged **LogonUser** method. This method is not in the .NET base class library, but is located in the unmanaged **advapi32.dll**. Accessing methods in unmanaged code is an advanced operation and is beyond the scope of this discussion. For more information, see [Interoperating with Unmanaged Code](../../standard/native-interop/index.md). For more information about the **LogonUser** method and **advapi32.dll**, see the Platform SDK documentation.
2. Create a new instance of the **WindowsIdentity** class, passing the token. The following code demonstrates this call, where `hToken` represents a Windows token.
@@ -63,5 +63,5 @@ Sometimes you might need to obtain a Windows account token to impersonate a Wind
-
-
- [Principal and Identity Objects](principal-and-identity-objects.md)
-- [Interoperating with Unmanaged Code](../../framework/interop/index.md)
+- [Interoperating with Unmanaged Code](../../standard/native-interop/index.md)
- [ASP.NET Core Security](/aspnet/core/security/)
diff --git a/docs/visual-basic/language-reference/error-messages/bc30828.md b/docs/visual-basic/language-reference/error-messages/bc30828.md
index 6349c22342012..7cd052ed0cc21 100644
--- a/docs/visual-basic/language-reference/error-messages/bc30828.md
+++ b/docs/visual-basic/language-reference/error-messages/bc30828.md
@@ -30,4 +30,4 @@ The `Any` data type was used with `Declare` statements in Visual Basic 6.0 and e
-
- [Walkthrough: Calling Windows APIs](../../programming-guide/com-interop/walkthrough-calling-windows-apis.md)
- [Declare Statement](../statements/declare-statement.md)
-- [Creating Prototypes in Managed Code](../../../framework/interop/creating-prototypes-in-managed-code.md)
+- [Creating Prototypes in Managed Code](../../../standard/native-interop/creating-prototypes-in-managed-code.md)
diff --git a/docs/visual-basic/language-reference/error-messages/bc40059.md b/docs/visual-basic/language-reference/error-messages/bc40059.md
index 1d5aac18a5237..d9fce4a8e6365 100644
--- a/docs/visual-basic/language-reference/error-messages/bc40059.md
+++ b/docs/visual-basic/language-reference/error-messages/bc40059.md
@@ -30,4 +30,4 @@ You have added a reference to an assembly (assembly1) that has the `Embed Intero
## See also
- [-link (Visual Basic)](../../reference/command-line-compiler/link.md)
-- [Interoperating with Unmanaged Code](../../../framework/interop/index.md)
+- [Interoperating with Unmanaged Code](../../../standard/native-interop/index.md)
diff --git a/docs/visual-basic/programming-guide/com-interop/com-interoperability-in-net-framework-applications.md b/docs/visual-basic/programming-guide/com-interop/com-interoperability-in-net-framework-applications.md
index 577d332d71e16..6cae68c6ffc67 100644
--- a/docs/visual-basic/programming-guide/com-interop/com-interoperability-in-net-framework-applications.md
+++ b/docs/visual-basic/programming-guide/com-interop/com-interoperability-in-net-framework-applications.md
@@ -21,7 +21,7 @@ The links on this page provide details on the interactions between COM and .NET
| Article | Description |
|---------|---------|
| [COM Interop](index.md) | Provides links to topics covering COM interoperability in Visual Basic, including COM objects, ActiveX controls, Win32 DLLs, managed objects, and inheritance of COM objects. |
-| [Interoperating with Unmanaged Code](../../../framework/interop/index.md) | Briefly describes some of the interaction issues between managed and unmanaged code, and provides links for further study. |
+| [Interoperating with Unmanaged Code](../../../standard/native-interop/index.md) | Briefly describes some of the interaction issues between managed and unmanaged code, and provides links for further study. |
| [COM Wrappers](../../../standard/native-interop/com-wrappers.md) | Discusses runtime callable wrappers, which allow managed code to call COM methods, and COM callable wrappers, which allow COM clients to call .NET object methods. |
-| [Advanced COM Interoperability](../../../framework/interop/index.md) | Provides links to topics covering COM interoperability with respect to wrappers, exceptions, inheritance, threading, events, conversions, and marshalling. |
+| [Advanced COM Interoperability](../../../standard/native-interop/index.md) | Provides links to topics covering COM interoperability with respect to wrappers, exceptions, inheritance, threading, events, conversions, and marshalling. |
| [Tlbimp.exe (Type Library Importer)](../../../framework/tools/tlbimp-exe-type-library-importer.md) | Discusses the tool you can use to convert the type definitions found within a COM type library into equivalent definitions in a common language runtime assembly. |
diff --git a/docs/visual-basic/programming-guide/com-interop/how-to-call-windows-apis.md b/docs/visual-basic/programming-guide/com-interop/how-to-call-windows-apis.md
index 10fd8de3aaa3e..6abacf1ff31c6 100644
--- a/docs/visual-basic/programming-guide/com-interop/how-to-call-windows-apis.md
+++ b/docs/visual-basic/programming-guide/com-interop/how-to-call-windows-apis.md
@@ -35,9 +35,9 @@ This example defines and calls the `MessageBox` function in user32.dll and then
## See also
-- [A Closer Look at Platform Invoke](../../../framework/interop/consuming-unmanaged-dll-functions.md#a-closer-look-at-platform-invoke)
-- [Platform Invoke Examples](../../../framework/interop/platform-invoke-examples.md)
-- [Consuming Unmanaged DLL Functions](../../../framework/interop/consuming-unmanaged-dll-functions.md)
+- [A Closer Look at Platform Invoke](../../../standard/native-interop/consuming-unmanaged-dll-functions.md#a-closer-look-at-platform-invoke)
+- [Platform Invoke Examples](../../../standard/native-interop/platform-invoke-examples.md)
+- [Consuming Unmanaged DLL Functions](../../../standard/native-interop/consuming-unmanaged-dll-functions.md)
- [Defining a Method with Reflection Emit](/previous-versions/dotnet/netframework-4.0/w63y4d4f(v=vs.100))
- [Walkthrough: Calling Windows APIs](walkthrough-calling-windows-apis.md)
- [COM Interop](index.md)
diff --git a/docs/visual-basic/programming-guide/com-interop/index.md b/docs/visual-basic/programming-guide/com-interop/index.md
index 39065a4910238..027158d0683d9 100644
--- a/docs/visual-basic/programming-guide/com-interop/index.md
+++ b/docs/visual-basic/programming-guide/com-interop/index.md
@@ -45,13 +45,13 @@ The Component Object Model (COM) allows an object to expose its functionality to
## Related Sections
- [Interoperating with Unmanaged Code](../../../framework/interop/index.md)
+ [Interoperating with Unmanaged Code](../../../standard/native-interop/index.md)
Describes interoperability services provided by the common language runtime.
- [Exposing COM Components to the .NET Framework](../../../framework/interop/exposing-com-components.md)
+ [Exposing COM Components to the .NET Framework](../../../standard/native-interop/exposing-com-components.md)
Describes the process of calling COM types through COM interop.
- [Exposing .NET Framework Components to COM](../../../framework/interop/exposing-dotnet-components-to-com.md)
+ [Exposing .NET Framework Components to COM](../../../standard/native-interop/exposing-dotnet-components-to-com.md)
Describes the preparation and use of managed types from COM.
[Applying Interop Attributes](../../../standard/native-interop/apply-interop-attributes.md)
diff --git a/docs/visual-basic/programming-guide/com-interop/introduction-to-com-interop.md b/docs/visual-basic/programming-guide/com-interop/introduction-to-com-interop.md
index 4a9677e5addf7..8011cb2048a64 100644
--- a/docs/visual-basic/programming-guide/com-interop/introduction-to-com-interop.md
+++ b/docs/visual-basic/programming-guide/com-interop/introduction-to-com-interop.md
@@ -2,65 +2,61 @@
description: "Learn more about: Introduction to COM Interop (Visual Basic)"
title: "Introduction to COM Interop"
ms.date: 07/20/2015
-helpviewer_keywords:
+helpviewer_keywords:
- "interop assemblies"
- "COM interop [Visual Basic], about COM interop"
ms.assetid: 8bd62e68-383d-407f-998b-29aa0ce0fd67
---
# Introduction to COM Interop (Visual Basic)
-The Component Object Model (COM) lets an object expose its functionality to other components and to host applications. While COM objects have been fundamental to Windows programming for many years, applications designed for the common language runtime (CLR) offer many advantages.
-
- .NET Framework applications will eventually replace those developed with COM. Until then, you may have to use or create COM objects by using Visual Studio. Interoperability with COM, or *COM interop*, enables you to use existing COM objects while transitioning to the .NET Framework at your own pace.
-
- By using the .NET Framework to create COM components, you can use registration-free COM interop. This lets you control which DLL version is enabled when more than one version is installed on a computer, and lets end users use XCOPY or FTP to copy your application to an appropriate directory on their computer where it can be run. For more information, see [Registration-Free COM Interop](../../../framework/interop/registration-free-com-interop.md).
-
-## Managed Code and Data
-
- Code developed for the .NET Framework is referred to as *managed code*, and contains metadata that is used by the CLR. Data used by .NET Framework applications is called *managed data* because the runtime manages data-related tasks such as allocating and reclaiming memory and performing type checking. By default, Visual Basic .NET uses managed code and data, but you can access the unmanaged code and data of COM objects using interop assemblies (described later on this page).
-
-## Assemblies
-
- An assembly is the primary building block of a .NET Framework application. It is a collection of functionality that is built, versioned, and deployed as a single implementation unit containing one or more files. Each assembly contains an assembly manifest.
-
-## Type Libraries and Assembly Manifests
-
- Type libraries describe characteristics of COM objects, such as member names and data types. Assembly manifests perform the same function for .NET Framework applications. They include information about the following:
-
-- Assembly identity, version, culture, and digital signature.
-
-- Files that make up the assembly implementation.
-
-- Types and resources that make up the assembly. This includes those that are exported from it.
-
-- Compile-time dependencies on other assemblies.
-
-- Permissions required for the assembly to run correctly.
-
- For more information about assemblies and assembly manifests, see [Assemblies in .NET](../../../standard/assembly/index.md).
-
-### Importing and Exporting Type Libraries
-
- Visual Studio contains a utility, Tlbimp, that lets you import information from a type library into a .NET Framework application. You can generate type libraries from assemblies by using the Tlbexp utility.
-
- For information about Tlbimp and Tlbexp, see [Tlbimp.exe (Type Library Importer)](../../../framework/tools/tlbimp-exe-type-library-importer.md) and [Tlbexp.exe (Type Library Exporter)](../../../framework/tools/tlbexp-exe-type-library-exporter.md).
-
-## Interop Assemblies
-
- Interop assemblies are .NET Framework assemblies that bridge between managed and unmanaged code, mapping COM object members to equivalent .NET Framework managed members. Interop assemblies created by Visual Basic .NET handle many of the details of working with COM objects, such as interoperability marshalling.
-
-## Interoperability Marshalling
-
- All .NET Framework applications share a set of common types that enable interoperability of objects, regardless of the programming language that is used. The parameters and return values of COM objects sometimes use data types that differ from those used in managed code. *Interoperability marshalling* is the process of packaging parameters and return values into equivalent data types as they move to and from COM objects. For more information, see [Interop Marshaling](../../../framework/interop/interop-marshalling.md).
-
+The Component Object Model (COM) lets an object expose its functionality to other components and to host applications. While COM objects have been fundamental to Windows programming for many years, applications designed for the common language runtime (CLR) offer many advantages.
+
+Interoperability with COM, or *COM interop*, enables you to use existing COM objects from .NET apps.
+
+By using .NET to create COM components, you can use registration-free COM interop. This lets you control which DLL version is enabled when more than one version is installed on a computer, and lets end users use XCOPY or FTP to copy your application to an appropriate directory on their computer where it can be run. For more information, see [Registration-Free COM Interop](../../../framework/interop/registration-free-com-interop.md).
+
+## Managed Code and Data
+
+Code developed for .NET is referred to as *managed code* and contains metadata that's used by the CLR. Data used by .NET applications is called *managed data* because the runtime manages data-related tasks such as allocating and reclaiming memory and performing type checking. By default, Visual Basic uses managed code and data, but you can access the unmanaged code and data of COM objects using interop assemblies (described later on this page).
+
+## Assemblies
+
+An assembly is the primary building block of a .NET application. It is a collection of functionality that is built, versioned, and deployed as a single implementation unit containing one or more files. Each assembly contains an assembly manifest.
+
+## Type Libraries and Assembly Manifests
+
+Type libraries describe characteristics of COM objects, such as member names and data types. Assembly manifests perform the same function for .NET applications. They include information about the following:
+
+- Assembly identity, version, culture, and digital signature.
+- Files that make up the assembly implementation.
+- Types and resources that make up the assembly. This includes those that are exported from it.
+- Compile-time dependencies on other assemblies.
+- Permissions required for the assembly to run correctly.
+
+For more information about assemblies and assembly manifests, see [Assemblies in .NET](../../../standard/assembly/index.md).
+
+### Importing and Exporting Type Libraries
+
+Visual Studio contains a utility, Tlbimp, that lets you import information from a type library into a .NET application. You can generate type libraries from assemblies by using the Tlbexp utility.
+
+For information about Tlbimp and Tlbexp, see [Tlbimp.exe (Type Library Importer)](../../../framework/tools/tlbimp-exe-type-library-importer.md) and [Tlbexp.exe (Type Library Exporter)](../../../framework/tools/tlbexp-exe-type-library-exporter.md).
+
+## Interop Assemblies
+
+Interop assemblies are .NET assemblies that bridge between managed and unmanaged code, mapping COM object members to equivalent .NET managed members. Interop assemblies created by Visual Basic .NET handle many of the details of working with COM objects, such as interoperability marshalling.
+
+## Interoperability Marshalling
+
+All .NET applications share a set of common types that enable interoperability of objects, regardless of the programming language that is used. The parameters and return values of COM objects sometimes use data types that differ from those used in managed code. *Interoperability marshalling* is the process of packaging parameters and return values into equivalent data types as they move to and from COM objects. For more information, see [Interop Marshaling](../../../standard/native-interop/interop-marshalling.md).
+
## See also
- [COM Interop](index.md)
- [Walkthrough: Implementing Inheritance with COM Objects](walkthrough-implementing-inheritance-with-com-objects.md)
-- [Interoperating with Unmanaged Code](../../../framework/interop/index.md)
+- [Interoperating with Unmanaged Code](../../../standard/native-interop/index.md)
- [Troubleshooting Interoperability](troubleshooting-interoperability.md)
- [Assemblies in .NET](../../../standard/assembly/index.md)
- [Tlbimp.exe (Type Library Importer)](../../../framework/tools/tlbimp-exe-type-library-importer.md)
- [Tlbexp.exe (Type Library Exporter)](../../../framework/tools/tlbexp-exe-type-library-exporter.md)
-- [Interop Marshaling](../../../framework/interop/interop-marshalling.md)
+- [Interop Marshaling](../../../standard/native-interop/interop-marshalling.md)
- [Registration-Free COM Interop](../../../framework/interop/registration-free-com-interop.md)
diff --git a/docs/visual-basic/programming-guide/com-interop/walkthrough-calling-windows-apis.md b/docs/visual-basic/programming-guide/com-interop/walkthrough-calling-windows-apis.md
index 1ebea13b72bb0..9b7990f2b5889 100644
--- a/docs/visual-basic/programming-guide/com-interop/walkthrough-calling-windows-apis.md
+++ b/docs/visual-basic/programming-guide/com-interop/walkthrough-calling-windows-apis.md
@@ -19,7 +19,7 @@ Windows APIs are dynamic-link libraries (DLLs) that are part of the Windows oper
The advantage of using Windows APIs in your code is that they can save development time because they contain dozens of useful functions that are already written and waiting to be used. The disadvantage is that Windows APIs can be difficult to work with and unforgiving when things go wrong.
- Windows APIs represent a special category of interoperability. Windows APIs do not use managed code, do not have built-in type libraries, and use data types that are different than those used with Visual Studio. Because of these differences, and because Windows APIs are not COM objects, interoperability with Windows APIs and the .NET Framework is performed using platform invoke, or PInvoke. Platform invoke is a service that enables managed code to call unmanaged functions implemented in DLLs. For more information, see [Consuming Unmanaged DLL Functions](../../../framework/interop/consuming-unmanaged-dll-functions.md). You can use PInvoke in Visual Basic by using either the `Declare` statement or applying the `DllImport` attribute to an empty procedure.
+ Windows APIs represent a special category of interoperability. Windows APIs do not use managed code, do not have built-in type libraries, and use data types that are different than those used with Visual Studio. Because of these differences, and because Windows APIs are not COM objects, interoperability with Windows APIs and the .NET Framework is performed using platform invoke, or PInvoke. Platform invoke is a service that enables managed code to call unmanaged functions implemented in DLLs. For more information, see [Consuming Unmanaged DLL Functions](../../../standard/native-interop/consuming-unmanaged-dll-functions.md). You can use PInvoke in Visual Basic by using either the `Declare` statement or applying the `DllImport` attribute to an empty procedure.
Windows API calls were an important part of Visual Basic programming in the past, but are seldom necessary with Visual Basic .NET. Whenever possible, you should use managed code from the .NET Framework to perform tasks, instead of Windows API calls. This walkthrough provides information for those situations in which using Windows APIs is necessary.
@@ -95,7 +95,7 @@ Windows APIs are dynamic-link libraries (DLLs) that are part of the Windows oper
#### Data Marshalling
- Visual Basic automatically converts the data types of parameters and return values for Windows API calls, but you can use the `MarshalAs` attribute to explicitly specify unmanaged data types that an API expects. For more information about interop marshalling, see [Interop Marshaling](../../../framework/interop/interop-marshalling.md).
+ Visual Basic automatically converts the data types of parameters and return values for Windows API calls, but you can use the `MarshalAs` attribute to explicitly specify unmanaged data types that an API expects. For more information about interop marshalling, see [Interop Marshaling](../../../standard/native-interop/interop-marshalling.md).
##### To use Declare and MarshalAs in an API call
@@ -159,5 +159,5 @@ Windows APIs are dynamic-link libraries (DLLs) that are part of the Windows oper
- [Auto](../../language-reference/modifiers/auto.md)
- [Alias](../../language-reference/statements/alias-clause.md)
- [COM Interop](index.md)
-- [Creating Prototypes in Managed Code](../../../framework/interop/creating-prototypes-in-managed-code.md)
-- [Marshalling a Delegate as a Callback Method](../../../framework/interop/marshalling-a-delegate-as-a-callback-method.md)
+- [Creating Prototypes in Managed Code](../../../standard/native-interop/creating-prototypes-in-managed-code.md)
+- [Marshalling a Delegate as a Callback Method](../../../standard/native-interop/marshalling-a-delegate-as-a-callback-method.md)
From 419633b9b4ea5003cd3baf33776d482bde3c71ea Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 9 Jul 2026 09:47:10 -0700
Subject: [PATCH 03/10] Bump the dotnet group with 5 updates (#54708)
Bumps Microsoft.Orleans.Core.Abstractions from 10.2.0 to 10.2.1
Bumps Microsoft.Orleans.Sdk from 10.2.0 to 10.2.1
Bumps Microsoft.Orleans.Server from 10.2.0 to 10.2.1
Bumps Microsoft.Orleans.Transactions from 10.2.0 to 10.2.1
Bumps Microsoft.Orleans.Transactions.AzureStorage from 10.2.0 to 10.2.1
---
updated-dependencies:
- dependency-name: Microsoft.Orleans.Core.Abstractions
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
- dependency-name: Microsoft.Orleans.Sdk
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
- dependency-name: Microsoft.Orleans.Server
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
- dependency-name: Microsoft.Orleans.Transactions
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
- dependency-name: Microsoft.Orleans.Transactions.AzureStorage
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
docs/orleans/Directory.Build.props | 4 ++--
.../snippets/transactions/Abstractions/Abstractions.csproj | 6 +++---
.../grains/snippets/transactions/Server/Server.csproj | 4 ++--
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/docs/orleans/Directory.Build.props b/docs/orleans/Directory.Build.props
index b0e96b24b300a..367bc46c74f70 100644
--- a/docs/orleans/Directory.Build.props
+++ b/docs/orleans/Directory.Build.props
@@ -13,8 +13,8 @@
-
-
+
+
diff --git a/docs/orleans/grains/snippets/transactions/Abstractions/Abstractions.csproj b/docs/orleans/grains/snippets/transactions/Abstractions/Abstractions.csproj
index 6802e845446a5..1d7149e2cceb0 100644
--- a/docs/orleans/grains/snippets/transactions/Abstractions/Abstractions.csproj
+++ b/docs/orleans/grains/snippets/transactions/Abstractions/Abstractions.csproj
@@ -3,9 +3,9 @@
-
-
-
+
+
+
diff --git a/docs/orleans/grains/snippets/transactions/Server/Server.csproj b/docs/orleans/grains/snippets/transactions/Server/Server.csproj
index 5ec2cb01baf2d..033c665ac475e 100644
--- a/docs/orleans/grains/snippets/transactions/Server/Server.csproj
+++ b/docs/orleans/grains/snippets/transactions/Server/Server.csproj
@@ -7,8 +7,8 @@
-
-
+
+
From 049f8856022d892d2d73602e734dab2dcfec53e3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 9 Jul 2026 09:48:19 -0700
Subject: [PATCH 04/10] Bump the dotnet group with 4 updates (#54710)
Bumps Microsoft.Orleans.BroadcastChannel from 10.2.0 to 10.2.1
Bumps Microsoft.Orleans.Sdk from 10.2.0 to 10.2.1
Bumps Microsoft.Orleans.Serialization.SystemTextJson from 10.2.0 to 10.2.1
Bumps Microsoft.Orleans.Server from 10.2.0 to 10.2.1
---
updated-dependencies:
- dependency-name: Microsoft.Orleans.BroadcastChannel
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
- dependency-name: Microsoft.Orleans.Serialization.SystemTextJson
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
- dependency-name: Microsoft.Orleans.Sdk
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
- dependency-name: Microsoft.Orleans.Server
dependency-version: 10.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: dotnet
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
.../BroadcastChannel.Silo/BroadcastChannel.Silo.csproj | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/orleans/streaming/snippets/broadcastchannel/BroadcastChannel.Silo/BroadcastChannel.Silo.csproj b/docs/orleans/streaming/snippets/broadcastchannel/BroadcastChannel.Silo/BroadcastChannel.Silo.csproj
index 4c5f4030c7e04..c93535304ffe1 100644
--- a/docs/orleans/streaming/snippets/broadcastchannel/BroadcastChannel.Silo/BroadcastChannel.Silo.csproj
+++ b/docs/orleans/streaming/snippets/broadcastchannel/BroadcastChannel.Silo/BroadcastChannel.Silo.csproj
@@ -7,9 +7,9 @@
-
-
-
+
+
+
From 7b5be11a13e35b7a96dada99aa6673d2bba7be2a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Amaury=20Lev=C3=A9?=
Date: Thu, 9 Jul 2026 19:52:44 +0200
Subject: [PATCH 05/10] Add MTP version column to AzDO and terminal option
tables (#54721)
* Add MTP version column to AzDO and terminal option tables
Move per-option availability version info out of prose notes and into a
dedicated MTP version column for the Azure DevOps report options and the
terminal output options, improving scannability and reducing note drift.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Clarify MTP version column meaning in AzDO and terminal tables
Address review feedback: reintroduce the Azure DevOps stability nuance
(became stable in MTP 1.9.0) and explain what the MTP version column
represents, and clarify that a dash denotes core options available since
the platform's initial releases.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
...rosoft-testing-platform-terminal-output.md | 21 ++++++------
...microsoft-testing-platform-test-reports.md | 32 +++++++++----------
2 files changed, 28 insertions(+), 25 deletions(-)
diff --git a/docs/core/testing/microsoft-testing-platform-terminal-output.md b/docs/core/testing/microsoft-testing-platform-terminal-output.md
index ae07042ab86c4..fac528fb6028a 100644
--- a/docs/core/testing/microsoft-testing-platform-terminal-output.md
+++ b/docs/core/testing/microsoft-testing-platform-terminal-output.md
@@ -43,15 +43,18 @@ The progress bar is written based on the selected mode:
## Options
-| Option | Description |
-|---|---|
-| `--no-progress` | Disables reporting progress to screen. Deprecated in MTP 2.3.0 in favor of `--progress off`. |
-| `--progress` | Controls whether progress is shown. Valid values are `auto` (default), `on` (also accepts `true`, `enable`, `1`), and `off` (also accepts `false`, `disable`, `0`). Available in MTP starting with version 2.3.0. |
-| `--no-ansi` | Disables outputting ANSI escape characters to screen. |
-| `--ansi` | Controls whether ANSI escape characters are emitted. Valid values are `auto` (default), `on` (also accepts `true`, `enable`, `1`), and `off` (also accepts `false`, `disable`, `0`). Available in MTP starting with version 2.3.0. |
-| `--output` | Specifies the output verbosity when reporting tests. Valid values are `Normal` and `Detailed`. Default is `Normal`. |
-| `--show-stdout` | Determines when to show captured standard output of a test. Valid values are `All`, `Failed`, and `None`. Default is `All`. Available in MTP starting with version 2.2.1. |
-| `--show-stderr` | Determines when to show captured error output of a test. Valid values are `All`, `Failed`, and `None`. Default is `All`. Available in MTP starting with version 2.2.1. |
+| Option | MTP version | Description |
+|---|---|---|
+| `--no-progress` | — | Disables reporting progress to screen. Deprecated in MTP 2.3.0 in favor of `--progress off`. |
+| `--progress` | 2.3.0 | Controls whether progress is shown. Valid values are `auto` (default), `on` (also accepts `true`, `enable`, `1`), and `off` (also accepts `false`, `disable`, `0`). |
+| `--no-ansi` | — | Disables outputting ANSI escape characters to screen. |
+| `--ansi` | 2.3.0 | Controls whether ANSI escape characters are emitted. Valid values are `auto` (default), `on` (also accepts `true`, `enable`, `1`), and `off` (also accepts `false`, `disable`, `0`). |
+| `--output` | — | Specifies the output verbosity when reporting tests. Valid values are `Normal` and `Detailed`. Default is `Normal`. |
+| `--show-stdout` | 2.2.1 | Determines when to show captured standard output of a test. Valid values are `All`, `Failed`, and `None`. Default is `All`. |
+| `--show-stderr` | 2.2.1 | Determines when to show captured error output of a test. Valid values are `All`, `Failed`, and `None`. Default is `All`. |
+
+> [!NOTE]
+> A dash (—) in the **MTP version** column marks core options that aren't tied to a specific version because they've been available since the platform's initial releases.
> [!NOTE]
> Starting with MTP 2.3.0, when MTP detects that it runs inside an LLM or AI tool environment, it suppresses the startup banner and changes the default of `--show-stdout` and `--show-stderr` from `All` to `Failed` to reduce noise.
diff --git a/docs/core/testing/microsoft-testing-platform-test-reports.md b/docs/core/testing/microsoft-testing-platform-test-reports.md
index a3ae65ed39d27..7b0df47f6a9e8 100644
--- a/docs/core/testing/microsoft-testing-platform-test-reports.md
+++ b/docs/core/testing/microsoft-testing-platform-test-reports.md
@@ -143,23 +143,23 @@ builder.TestHost.AddAzureDevOpsProvider();
### Options
-| Option | Description |
-|---|---|
-| `--report-azdo` | Enables the Azure DevOps report generator. Errors and warnings are written to the output in a format that Azure DevOps understands. |
-| `--report-azdo-severity` | Severity to use for reported events. Valid values are `error` (default) and `warning`. |
-| `--report-azdo-flaky-history` | Queries Azure DevOps test result history for the past N days (1-90) and annotates reported failures with flakiness context. Requires `--report-azdo`. |
-| `--report-azdo-demote-known-flaky` | Demotes failures that are flaky enough in the Azure DevOps history window (default threshold is 25%) from errors to warnings. Requires `--report-azdo` and `--report-azdo-flaky-history`. |
-| `--report-azdo-quarantine-file` | Path to a text file that lists quarantined test fully qualified names or glob patterns. Matching failures are reported as warnings. Requires `--report-azdo`. |
-| `--report-azdo-summary` | Writes a Markdown job summary at the end of the test run and uploads it through `##vso[task.uploadsummary]`. An optional file path argument overrides the default location (`{testResultsDir}/azdo-summary-{tfm}.md`). Requires `--report-azdo`. |
-| `--report-azdo-stackframe-filter` | Adds regex patterns, matched against the fully qualified type prefix of each stack frame, that are skipped when the extension locates the user's call site to annotate. The option is repeatable, up to 16 patterns, and each pattern is compiled with a 500-ms match timeout. These patterns are additive to the extension's built-in MSTest assertion-implementation prefixes. Requires `--report-azdo`. |
-| `--report-azdo-upload-artifacts` | Uploads test result files and/or adds build tags to Azure DevOps. Valid values are `off` (default), `tags-only`, `files`, and `all`. |
-| `--report-azdo-upload-artifact-include` | Includes files in the Azure DevOps artifact upload using glob patterns relative to the test results directory. Defaults to `**/*`. Requires `--report-azdo-upload-artifacts` to be a value other than `off`. |
-| `--report-azdo-upload-artifact-exclude` | Excludes files from the Azure DevOps artifact upload using glob patterns relative to the test results directory. Requires `--report-azdo-upload-artifacts` to be a value other than `off`. |
-| `--report-azdo-upload-artifact-name` | Overrides the Azure DevOps artifact container name. Defaults to `TestResults_{assemblyName}_{tfm}`. Requires `--report-azdo-upload-artifacts` to be a value other than `off`. |
-| `--publish-azdo-test-results` | Publishes test results live to the Azure DevOps **Tests** tab. |
-| `--publish-azdo-run-name` | Sets a custom Azure DevOps test run name for live test-result publishing. Requires `--publish-azdo-test-results`. |
+| Option | MTP version | Description |
+|---|---|---|
+| `--report-azdo` | 1.9.0 | Enables the Azure DevOps report generator. Errors and warnings are written to the output in a format that Azure DevOps understands. |
+| `--report-azdo-severity` | 1.9.0 | Severity to use for reported events. Valid values are `error` (default) and `warning`. |
+| `--report-azdo-flaky-history` | 2.3.0 | Queries Azure DevOps test result history for the past N days (1-90) and annotates reported failures with flakiness context. Requires `--report-azdo`. |
+| `--report-azdo-demote-known-flaky` | 2.3.0 | Demotes failures that are flaky enough in the Azure DevOps history window (default threshold is 25%) from errors to warnings. Requires `--report-azdo` and `--report-azdo-flaky-history`. |
+| `--report-azdo-quarantine-file` | 2.3.0 | Path to a text file that lists quarantined test fully qualified names or glob patterns. Matching failures are reported as warnings. Requires `--report-azdo`. |
+| `--report-azdo-summary` | 2.3.0 | Writes a Markdown job summary at the end of the test run and uploads it through `##vso[task.uploadsummary]`. An optional file path argument overrides the default location (`{testResultsDir}/azdo-summary-{tfm}.md`). Requires `--report-azdo`. |
+| `--report-azdo-stackframe-filter` | 2.3.0 | Adds regex patterns, matched against the fully qualified type prefix of each stack frame, that are skipped when the extension locates the user's call site to annotate. The option is repeatable, up to 16 patterns, and each pattern is compiled with a 500-ms match timeout. These patterns are additive to the extension's built-in MSTest assertion-implementation prefixes. Requires `--report-azdo`. |
+| `--report-azdo-upload-artifacts` | 2.3.0 | Uploads test result files and/or adds build tags to Azure DevOps. Valid values are `off` (default), `tags-only`, `files`, and `all`. |
+| `--report-azdo-upload-artifact-include` | 2.3.0 | Includes files in the Azure DevOps artifact upload using glob patterns relative to the test results directory. Defaults to `**/*`. Requires `--report-azdo-upload-artifacts` to be a value other than `off`. |
+| `--report-azdo-upload-artifact-exclude` | 2.3.0 | Excludes files from the Azure DevOps artifact upload using glob patterns relative to the test results directory. Requires `--report-azdo-upload-artifacts` to be a value other than `off`. |
+| `--report-azdo-upload-artifact-name` | 2.3.0 | Overrides the Azure DevOps artifact container name. Defaults to `TestResults_{assemblyName}_{tfm}`. Requires `--report-azdo-upload-artifacts` to be a value other than `off`. |
+| `--publish-azdo-test-results` | 2.3.0 | Publishes test results live to the Azure DevOps **Tests** tab. |
+| `--publish-azdo-run-name` | 2.3.0 | Sets a custom Azure DevOps test run name for live test-result publishing. Requires `--publish-azdo-test-results`. |
> [!NOTE]
-> The Azure DevOps extension became stable in MTP 1.9.0 (`--report-azdo` and `--report-azdo-severity`). All other options in the table — `--report-azdo-flaky-history`, `--report-azdo-demote-known-flaky`, `--report-azdo-quarantine-file`, `--report-azdo-summary`, `--report-azdo-stackframe-filter`, `--report-azdo-upload-artifacts`, `--report-azdo-upload-artifact-include`, `--report-azdo-upload-artifact-exclude`, `--report-azdo-upload-artifact-name`, `--publish-azdo-test-results`, and `--publish-azdo-run-name` — are available in MTP starting with version 2.3.0.
+> The **MTP version** column lists the MTP release in which each option first became available in a stable build. The Azure DevOps extension itself became stable in MTP 1.9.0 with `--report-azdo` and `--report-azdo-severity`; the remaining options were added in MTP 2.3.0.
The extension automatically detects that it is running in continuous integration (CI) environment by checking the `TF_BUILD` environment variable.
From a17f587c10abda4f0f3ad9abc0a80c4f18822956 Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Thu, 9 Jul 2026 11:18:21 -0700
Subject: [PATCH 06/10] Document IDE0410: Use labeled jump statement (#54725)
* Initial plan
* Add IDE0410 documentation: Use labeled jump statement
* Fix overview sentence in ide0410.md to lead with reason first
* Address code review feedback: reword overview and clarify empty statement
* Apply suggestions from code review
Co-authored-by: Genevieve Warren <24882762+gewarren@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Genevieve Warren <24882762+gewarren@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---
.../code-analysis/style-rules/ide0410.md | 169 ++++++++++++++++++
.../code-analysis/style-rules/index.md | 3 +-
.../style-rules/language-rules.md | 3 +-
docs/navigate/tools-diagnostics/toc.yml | 2 +
4 files changed, 175 insertions(+), 2 deletions(-)
create mode 100644 docs/fundamentals/code-analysis/style-rules/ide0410.md
diff --git a/docs/fundamentals/code-analysis/style-rules/ide0410.md b/docs/fundamentals/code-analysis/style-rules/ide0410.md
new file mode 100644
index 0000000000000..48b21bf0f4e29
--- /dev/null
+++ b/docs/fundamentals/code-analysis/style-rules/ide0410.md
@@ -0,0 +1,169 @@
+---
+title: "IDE0410: Use labeled jump statement"
+description: "Learn about code analysis rule IDE0410: Use labeled jump statement"
+ms.date: 07/09/2026
+f1_keywords:
+- IDE0410
+helpviewer_keywords:
+- IDE0410
+dev_langs:
+- CSharp
+ai-usage: ai-assisted
+---
+# Use labeled jump statement (IDE0410)
+
+| Property | Value |
+|--------------------------|------------------------------------------------|
+| **Rule ID** | IDE0410 |
+| **Title** | Use labeled jump statement |
+| **Category** | Style |
+| **Subcategory** | Language rules (code-block preferences) |
+| **Applicable languages** | C# 15+ |
+| **Options** | `csharp_style_prefer_labeled_jump_statements` |
+
+## Overview
+
+For clearer, more concise nested loop control flow, this rule flags code that uses `goto` statements or Boolean flag patterns to break out of or continue nested loops, when a [labeled `break` or `continue` statement](../../../csharp/language-reference/statements/jump-statements.md) (C# 15+) could be used instead.
+
+The rule detects the following patterns:
+
+- A `goto` statement that jumps to a label immediately after a nested loop, which can be replaced with `break