From 914127f00753475861a22659d55a08a767676fd0 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Thu, 8 Jan 2026 10:31:59 -0600 Subject: [PATCH 1/3] [illink] set `$(StartupHookSupport)=false` *only* for Release mode Context: https://github.com/dotnet/runtime/blob/242f7b23752599f22157268de41fee91cb97ef6c/docs/design/features/host-startup-hook.md .NET has a concept of a "startup hook", which appears to work fine on Mono if you set: env.txt DOTNET_STARTUP_HOOKS=StartupHook (MSBuild) true The startup hook is a managed assembly with a static method, in the "global" namespace: class StartupHook { public static void Initialize() { // ... } } When the runtime starts, it will call `StartupHook.Initialize()` before any other managed code is executed. `dotnet watch` (Hot Reload) relies on this feature. I added a test to `Mono.Android-Tests` to verify that the startup hook was called. This is not yet working on CoreCLR on Android, investigation ongoing. --- Xamarin.Android-Tests.sln | 279 +++++++++++++++++- ...soft.Android.Sdk.DefaultProperties.targets | 3 +- .../Mono.Android.NET-Tests.csproj | 4 + .../System/StartupHookTest.cs | 24 ++ .../Mono.Android-Tests/env.txt | 1 + tests/StartupHook/StartupHook.cs | 13 + tests/StartupHook/StartupHook.csproj | 10 + 7 files changed, 328 insertions(+), 6 deletions(-) create mode 100644 tests/Mono.Android-Tests/Mono.Android-Tests/System/StartupHookTest.cs create mode 100644 tests/StartupHook/StartupHook.cs create mode 100644 tests/StartupHook/StartupHook.csproj diff --git a/Xamarin.Android-Tests.sln b/Xamarin.Android-Tests.sln index 5fef951e31b..3d3b782fa71 100644 --- a/Xamarin.Android-Tests.sln +++ b/Xamarin.Android-Tests.sln @@ -80,145 +80,408 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Java.Interop-Tests", "tests EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Java.Interop", "external\Java.Interop\src\Java.Interop\Java.Interop.csproj", "{94BD81F7-B06F-4295-9636-F8A3B6BDC762}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartupHook", "tests\StartupHook\StartupHook.csproj", "{3220BC41-7332-49A7-9286-5131477808EF}" +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - tests\Mono.Android-Tests\Mono.Android-Test.Shared.projitems*{0ab4956e-6fb9-4da0-9d49-ab65a3ff403a}*SharedItemsImports = 13 - tests\Mono.Android-Tests\Mono.Android-Test.Shared.projitems*{40ead437-216b-4df4-8258-3f47e1672c3a}*SharedItemsImports = 4 - tests\Mono.Android-Tests\Mono.Android-Test.Shared.projitems*{9ecbea14-b79f-4f92-9266-495c03a32571}*SharedItemsImports = 4 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Debug|Any CPU.Build.0 = Debug|Any CPU {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Debug|x64.ActiveCfg = Debug|Any CPU + {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Debug|x64.Build.0 = Debug|Any CPU + {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Debug|x86.ActiveCfg = Debug|Any CPU + {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Debug|x86.Build.0 = Debug|Any CPU {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Release|Any CPU.ActiveCfg = Release|Any CPU {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Release|Any CPU.Build.0 = Release|Any CPU {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Release|Any CPU.Deploy.0 = Release|Any CPU + {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Release|x64.ActiveCfg = Release|Any CPU + {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Release|x64.Build.0 = Release|Any CPU + {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Release|x86.ActiveCfg = Release|Any CPU + {40EAD437-216B-4DF4-8258-3F47E1672C3A}.Release|x86.Build.0 = Release|Any CPU {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Debug|x64.ActiveCfg = Debug|Any CPU + {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Debug|x64.Build.0 = Debug|Any CPU + {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Debug|x86.ActiveCfg = Debug|Any CPU + {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Debug|x86.Build.0 = Debug|Any CPU {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Release|Any CPU.ActiveCfg = Release|Any CPU {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Release|Any CPU.Build.0 = Release|Any CPU + {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Release|x64.ActiveCfg = Release|Any CPU + {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Release|x64.Build.0 = Release|Any CPU + {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Release|x86.ActiveCfg = Release|Any CPU + {2305B00D-DE81-4744-B0DA-357835CAFE5A}.Release|x86.Build.0 = Release|Any CPU {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Debug|x64.ActiveCfg = Debug|Any CPU + {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Debug|x64.Build.0 = Debug|Any CPU + {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Debug|x86.ActiveCfg = Debug|Any CPU + {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Debug|x86.Build.0 = Debug|Any CPU {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Release|Any CPU.ActiveCfg = Release|Any CPU {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Release|Any CPU.Build.0 = Release|Any CPU + {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Release|x64.ActiveCfg = Release|Any CPU + {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Release|x64.Build.0 = Release|Any CPU + {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Release|x86.ActiveCfg = Release|Any CPU + {6BE66B30-9346-4DA6-B09A-0CDC1DFE33C2}.Release|x86.Build.0 = Release|Any CPU {05768F39-7BAF-43E6-971E-712F5771E88E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {05768F39-7BAF-43E6-971E-712F5771E88E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05768F39-7BAF-43E6-971E-712F5771E88E}.Debug|x64.ActiveCfg = Debug|Any CPU + {05768F39-7BAF-43E6-971E-712F5771E88E}.Debug|x64.Build.0 = Debug|Any CPU + {05768F39-7BAF-43E6-971E-712F5771E88E}.Debug|x86.ActiveCfg = Debug|Any CPU + {05768F39-7BAF-43E6-971E-712F5771E88E}.Debug|x86.Build.0 = Debug|Any CPU {05768F39-7BAF-43E6-971E-712F5771E88E}.Release|Any CPU.ActiveCfg = Release|Any CPU {05768F39-7BAF-43E6-971E-712F5771E88E}.Release|Any CPU.Build.0 = Release|Any CPU + {05768F39-7BAF-43E6-971E-712F5771E88E}.Release|x64.ActiveCfg = Release|Any CPU + {05768F39-7BAF-43E6-971E-712F5771E88E}.Release|x64.Build.0 = Release|Any CPU + {05768F39-7BAF-43E6-971E-712F5771E88E}.Release|x86.ActiveCfg = Release|Any CPU + {05768F39-7BAF-43E6-971E-712F5771E88E}.Release|x86.Build.0 = Release|Any CPU {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Debug|x64.ActiveCfg = Debug|Any CPU + {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Debug|x64.Build.0 = Debug|Any CPU + {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Debug|x86.ActiveCfg = Debug|Any CPU + {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Debug|x86.Build.0 = Debug|Any CPU {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Release|Any CPU.ActiveCfg = Release|Any CPU {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Release|Any CPU.Build.0 = Release|Any CPU + {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Release|x64.ActiveCfg = Release|Any CPU + {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Release|x64.Build.0 = Release|Any CPU + {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Release|x86.ActiveCfg = Release|Any CPU + {9D5C83B5-70D5-4CC2-9DB7-78B23DC8F255}.Release|x86.Build.0 = Release|Any CPU {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Debug|x64.ActiveCfg = Debug|Any CPU + {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Debug|x64.Build.0 = Debug|Any CPU + {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Debug|x86.ActiveCfg = Debug|Any CPU + {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Debug|x86.Build.0 = Debug|Any CPU {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Release|Any CPU.Build.0 = Release|Any CPU + {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Release|x64.ActiveCfg = Release|Any CPU + {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Release|x64.Build.0 = Release|Any CPU + {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Release|x86.ActiveCfg = Release|Any CPU + {EF798EB3-D639-4E09-9DB0-233E67F727B0}.Release|x86.Build.0 = Release|Any CPU {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Debug|x64.ActiveCfg = Debug|Any CPU + {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Debug|x64.Build.0 = Debug|Any CPU + {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Debug|x86.ActiveCfg = Debug|Any CPU + {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Debug|x86.Build.0 = Debug|Any CPU {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Release|Any CPU.ActiveCfg = Release|Any CPU {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Release|Any CPU.Build.0 = Release|Any CPU + {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Release|x64.ActiveCfg = Release|Any CPU + {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Release|x64.Build.0 = Release|Any CPU + {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Release|x86.ActiveCfg = Release|Any CPU + {9553ED9D-92EA-411B-ADFF-21C5608CCD16}.Release|x86.Build.0 = Release|Any CPU {91105023-9421-4E56-A87B-64BC62525D55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {91105023-9421-4E56-A87B-64BC62525D55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91105023-9421-4E56-A87B-64BC62525D55}.Debug|x64.ActiveCfg = Debug|Any CPU + {91105023-9421-4E56-A87B-64BC62525D55}.Debug|x64.Build.0 = Debug|Any CPU + {91105023-9421-4E56-A87B-64BC62525D55}.Debug|x86.ActiveCfg = Debug|Any CPU + {91105023-9421-4E56-A87B-64BC62525D55}.Debug|x86.Build.0 = Debug|Any CPU {91105023-9421-4E56-A87B-64BC62525D55}.Release|Any CPU.ActiveCfg = Release|Any CPU {91105023-9421-4E56-A87B-64BC62525D55}.Release|Any CPU.Build.0 = Release|Any CPU + {91105023-9421-4E56-A87B-64BC62525D55}.Release|x64.ActiveCfg = Release|Any CPU + {91105023-9421-4E56-A87B-64BC62525D55}.Release|x64.Build.0 = Release|Any CPU + {91105023-9421-4E56-A87B-64BC62525D55}.Release|x86.ActiveCfg = Release|Any CPU + {91105023-9421-4E56-A87B-64BC62525D55}.Release|x86.Build.0 = Release|Any CPU {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Debug|x64.Build.0 = Debug|Any CPU + {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Debug|x86.ActiveCfg = Debug|Any CPU + {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Debug|x86.Build.0 = Debug|Any CPU {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Release|Any CPU.ActiveCfg = Release|Any CPU {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Release|Any CPU.Build.0 = Release|Any CPU + {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Release|x64.ActiveCfg = Release|Any CPU + {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Release|x64.Build.0 = Release|Any CPU + {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Release|x86.ActiveCfg = Release|Any CPU + {7B9D9F32-973F-49CF-A8F8-05BDFC75556C}.Release|x86.Build.0 = Release|Any CPU {B7476528-C166-40BF-931F-EAEB02247879}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B7476528-C166-40BF-931F-EAEB02247879}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7476528-C166-40BF-931F-EAEB02247879}.Debug|x64.ActiveCfg = Debug|Any CPU + {B7476528-C166-40BF-931F-EAEB02247879}.Debug|x64.Build.0 = Debug|Any CPU + {B7476528-C166-40BF-931F-EAEB02247879}.Debug|x86.ActiveCfg = Debug|Any CPU + {B7476528-C166-40BF-931F-EAEB02247879}.Debug|x86.Build.0 = Debug|Any CPU {B7476528-C166-40BF-931F-EAEB02247879}.Release|Any CPU.ActiveCfg = Release|Any CPU {B7476528-C166-40BF-931F-EAEB02247879}.Release|Any CPU.Build.0 = Release|Any CPU + {B7476528-C166-40BF-931F-EAEB02247879}.Release|x64.ActiveCfg = Release|Any CPU + {B7476528-C166-40BF-931F-EAEB02247879}.Release|x64.Build.0 = Release|Any CPU + {B7476528-C166-40BF-931F-EAEB02247879}.Release|x86.ActiveCfg = Release|Any CPU + {B7476528-C166-40BF-931F-EAEB02247879}.Release|x86.Build.0 = Release|Any CPU {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Debug|x64.ActiveCfg = Debug|Any CPU + {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Debug|x64.Build.0 = Debug|Any CPU + {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Debug|x86.ActiveCfg = Debug|Any CPU + {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Debug|x86.Build.0 = Debug|Any CPU {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Release|Any CPU.ActiveCfg = Release|Any CPU {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Release|Any CPU.Build.0 = Release|Any CPU + {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Release|x64.ActiveCfg = Release|Any CPU + {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Release|x64.Build.0 = Release|Any CPU + {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Release|x86.ActiveCfg = Release|Any CPU + {9479B71F-19FE-48F9-AB3F-AE764D76038A}.Release|x86.Build.0 = Release|Any CPU {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Debug|x64.ActiveCfg = Debug|Any CPU + {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Debug|x64.Build.0 = Debug|Any CPU + {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Debug|x86.ActiveCfg = Debug|Any CPU + {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Debug|x86.Build.0 = Debug|Any CPU {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Release|Any CPU.Build.0 = Release|Any CPU + {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Release|x64.ActiveCfg = Release|Any CPU + {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Release|x64.Build.0 = Release|Any CPU + {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Release|x86.ActiveCfg = Release|Any CPU + {2A0519DF-0DDA-45F7-AC3C-E2992748D364}.Release|x86.Build.0 = Release|Any CPU {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Debug|x64.ActiveCfg = Debug|Any CPU + {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Debug|x64.Build.0 = Debug|Any CPU + {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Debug|x86.ActiveCfg = Debug|Any CPU + {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Debug|x86.Build.0 = Debug|Any CPU {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Release|Any CPU.ActiveCfg = Release|Any CPU {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Release|Any CPU.Build.0 = Release|Any CPU + {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Release|x64.ActiveCfg = Release|Any CPU + {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Release|x64.Build.0 = Release|Any CPU + {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Release|x86.ActiveCfg = Release|Any CPU + {DD4E2A49-730C-41FD-B6D4-AFB73F94271F}.Release|x86.Build.0 = Release|Any CPU {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Debug|x64.ActiveCfg = Debug|Any CPU + {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Debug|x64.Build.0 = Debug|Any CPU + {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Debug|x86.ActiveCfg = Debug|Any CPU + {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Debug|x86.Build.0 = Debug|Any CPU {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Release|Any CPU.ActiveCfg = Release|Any CPU {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Release|Any CPU.Build.0 = Release|Any CPU + {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Release|x64.ActiveCfg = Release|Any CPU + {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Release|x64.Build.0 = Release|Any CPU + {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Release|x86.ActiveCfg = Release|Any CPU + {9802CB35-0BC0-4EE1-9A81-BB40BD97945A}.Release|x86.Build.0 = Release|Any CPU {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Debug|x64.Build.0 = Debug|Any CPU + {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Debug|x86.Build.0 = Debug|Any CPU {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Release|Any CPU.ActiveCfg = Release|Any CPU {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Release|Any CPU.Build.0 = Release|Any CPU + {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Release|x64.ActiveCfg = Release|Any CPU + {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Release|x64.Build.0 = Release|Any CPU + {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Release|x86.ActiveCfg = Release|Any CPU + {5BDCEF07-E3D7-4E73-B025-6E43A5A7D7F1}.Release|x86.Build.0 = Release|Any CPU {B297008B-C313-455E-B230-E119589D2D79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B297008B-C313-455E-B230-E119589D2D79}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B297008B-C313-455E-B230-E119589D2D79}.Debug|x64.ActiveCfg = Debug|Any CPU + {B297008B-C313-455E-B230-E119589D2D79}.Debug|x64.Build.0 = Debug|Any CPU + {B297008B-C313-455E-B230-E119589D2D79}.Debug|x86.ActiveCfg = Debug|Any CPU + {B297008B-C313-455E-B230-E119589D2D79}.Debug|x86.Build.0 = Debug|Any CPU {B297008B-C313-455E-B230-E119589D2D79}.Release|Any CPU.ActiveCfg = Release|Any CPU {B297008B-C313-455E-B230-E119589D2D79}.Release|Any CPU.Build.0 = Release|Any CPU + {B297008B-C313-455E-B230-E119589D2D79}.Release|x64.ActiveCfg = Release|Any CPU + {B297008B-C313-455E-B230-E119589D2D79}.Release|x64.Build.0 = Release|Any CPU + {B297008B-C313-455E-B230-E119589D2D79}.Release|x86.ActiveCfg = Release|Any CPU + {B297008B-C313-455E-B230-E119589D2D79}.Release|x86.Build.0 = Release|Any CPU {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Debug|x64.ActiveCfg = Debug|Any CPU + {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Debug|x64.Build.0 = Debug|Any CPU + {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Debug|x86.ActiveCfg = Debug|Any CPU + {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Debug|x86.Build.0 = Debug|Any CPU {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Release|Any CPU.Build.0 = Release|Any CPU + {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Release|x64.ActiveCfg = Release|Any CPU + {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Release|x64.Build.0 = Release|Any CPU + {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Release|x86.ActiveCfg = Release|Any CPU + {195BE9C2-1F91-40DC-BD6D-DE860BF083FB}.Release|x86.Build.0 = Release|Any CPU {576312CC-83FF-48B1-A473-488CDC7121AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {576312CC-83FF-48B1-A473-488CDC7121AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {576312CC-83FF-48B1-A473-488CDC7121AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {576312CC-83FF-48B1-A473-488CDC7121AD}.Debug|x64.Build.0 = Debug|Any CPU + {576312CC-83FF-48B1-A473-488CDC7121AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {576312CC-83FF-48B1-A473-488CDC7121AD}.Debug|x86.Build.0 = Debug|Any CPU {576312CC-83FF-48B1-A473-488CDC7121AD}.Release|Any CPU.ActiveCfg = Release|Any CPU {576312CC-83FF-48B1-A473-488CDC7121AD}.Release|Any CPU.Build.0 = Release|Any CPU + {576312CC-83FF-48B1-A473-488CDC7121AD}.Release|x64.ActiveCfg = Release|Any CPU + {576312CC-83FF-48B1-A473-488CDC7121AD}.Release|x64.Build.0 = Release|Any CPU + {576312CC-83FF-48B1-A473-488CDC7121AD}.Release|x86.ActiveCfg = Release|Any CPU + {576312CC-83FF-48B1-A473-488CDC7121AD}.Release|x86.Build.0 = Release|Any CPU {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Debug|x64.Build.0 = Debug|Any CPU + {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Debug|x86.ActiveCfg = Debug|Any CPU + {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Debug|x86.Build.0 = Debug|Any CPU {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Release|Any CPU.Build.0 = Release|Any CPU + {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Release|x64.ActiveCfg = Release|Any CPU + {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Release|x64.Build.0 = Release|Any CPU + {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Release|x86.ActiveCfg = Release|Any CPU + {3CC4E384-4985-4D93-A34C-73F69A379FA7}.Release|x86.Build.0 = Release|Any CPU {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Debug|x64.ActiveCfg = Debug|Any CPU + {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Debug|x64.Build.0 = Debug|Any CPU + {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Debug|x86.ActiveCfg = Debug|Any CPU + {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Debug|x86.Build.0 = Debug|Any CPU {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Release|Any CPU.Build.0 = Release|Any CPU + {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Release|x64.ActiveCfg = Release|Any CPU + {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Release|x64.Build.0 = Release|Any CPU + {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Release|x86.ActiveCfg = Release|Any CPU + {CB2335CB-0050-4020-8A05-E9614EDAA05E}.Release|x86.Build.0 = Release|Any CPU {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Debug|x64.ActiveCfg = Debug|Any CPU + {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Debug|x64.Build.0 = Debug|Any CPU + {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Debug|x86.ActiveCfg = Debug|Any CPU + {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Debug|x86.Build.0 = Debug|Any CPU {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Release|Any CPU.ActiveCfg = Release|Any CPU {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Release|Any CPU.Build.0 = Release|Any CPU + {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Release|x64.ActiveCfg = Release|Any CPU + {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Release|x64.Build.0 = Release|Any CPU + {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Release|x86.ActiveCfg = Release|Any CPU + {57DC8529-2628-40C4-B27E-BAC1AE44A706}.Release|x86.Build.0 = Release|Any CPU {95012FA9-ED51-4004-8F36-91DB361C892B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95012FA9-ED51-4004-8F36-91DB361C892B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95012FA9-ED51-4004-8F36-91DB361C892B}.Debug|x64.ActiveCfg = Debug|Any CPU + {95012FA9-ED51-4004-8F36-91DB361C892B}.Debug|x64.Build.0 = Debug|Any CPU + {95012FA9-ED51-4004-8F36-91DB361C892B}.Debug|x86.ActiveCfg = Debug|Any CPU + {95012FA9-ED51-4004-8F36-91DB361C892B}.Debug|x86.Build.0 = Debug|Any CPU {95012FA9-ED51-4004-8F36-91DB361C892B}.Release|Any CPU.ActiveCfg = Release|Any CPU {95012FA9-ED51-4004-8F36-91DB361C892B}.Release|Any CPU.Build.0 = Release|Any CPU + {95012FA9-ED51-4004-8F36-91DB361C892B}.Release|x64.ActiveCfg = Release|Any CPU + {95012FA9-ED51-4004-8F36-91DB361C892B}.Release|x64.Build.0 = Release|Any CPU + {95012FA9-ED51-4004-8F36-91DB361C892B}.Release|x86.ActiveCfg = Release|Any CPU + {95012FA9-ED51-4004-8F36-91DB361C892B}.Release|x86.Build.0 = Release|Any CPU {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Debug|x64.ActiveCfg = Debug|Any CPU + {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Debug|x64.Build.0 = Debug|Any CPU + {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Debug|x86.Build.0 = Debug|Any CPU {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Release|Any CPU.ActiveCfg = Release|Any CPU {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Release|Any CPU.Build.0 = Release|Any CPU + {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Release|x64.ActiveCfg = Release|Any CPU + {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Release|x64.Build.0 = Release|Any CPU + {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Release|x86.ActiveCfg = Release|Any CPU + {7A5FB23C-6B26-461A-8BBD-02392DCE3C11}.Release|x86.Build.0 = Release|Any CPU {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|x64.ActiveCfg = Debug|Any CPU + {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|x64.Build.0 = Debug|Any CPU + {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|x86.ActiveCfg = Debug|Any CPU + {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Debug|x86.Build.0 = Debug|Any CPU {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|Any CPU.ActiveCfg = Release|Any CPU {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|Any CPU.Build.0 = Release|Any CPU + {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|x64.ActiveCfg = Release|Any CPU + {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|x64.Build.0 = Release|Any CPU + {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|x86.ActiveCfg = Release|Any CPU + {2DD1EE75-6D8D-4653-A800-0A24367F7F38}.Release|x86.Build.0 = Release|Any CPU {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Debug|x64.ActiveCfg = Debug|Any CPU + {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Debug|x64.Build.0 = Debug|Any CPU + {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Debug|x86.ActiveCfg = Debug|Any CPU + {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Debug|x86.Build.0 = Debug|Any CPU {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Release|Any CPU.ActiveCfg = Release|Any CPU {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Release|Any CPU.Build.0 = Release|Any CPU + {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Release|x64.ActiveCfg = Release|Any CPU + {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Release|x64.Build.0 = Release|Any CPU + {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Release|x86.ActiveCfg = Release|Any CPU + {37CAA28C-40BE-4253-BA68-CC5D7316A617}.Release|x86.Build.0 = Release|Any CPU {056ED976-618F-4A3E-910E-AA25230C2296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {056ED976-618F-4A3E-910E-AA25230C2296}.Debug|Any CPU.Build.0 = Debug|Any CPU + {056ED976-618F-4A3E-910E-AA25230C2296}.Debug|x64.ActiveCfg = Debug|Any CPU + {056ED976-618F-4A3E-910E-AA25230C2296}.Debug|x64.Build.0 = Debug|Any CPU + {056ED976-618F-4A3E-910E-AA25230C2296}.Debug|x86.ActiveCfg = Debug|Any CPU + {056ED976-618F-4A3E-910E-AA25230C2296}.Debug|x86.Build.0 = Debug|Any CPU {056ED976-618F-4A3E-910E-AA25230C2296}.Release|Any CPU.ActiveCfg = Release|Any CPU {056ED976-618F-4A3E-910E-AA25230C2296}.Release|Any CPU.Build.0 = Release|Any CPU + {056ED976-618F-4A3E-910E-AA25230C2296}.Release|x64.ActiveCfg = Release|Any CPU + {056ED976-618F-4A3E-910E-AA25230C2296}.Release|x64.Build.0 = Release|Any CPU + {056ED976-618F-4A3E-910E-AA25230C2296}.Release|x86.ActiveCfg = Release|Any CPU + {056ED976-618F-4A3E-910E-AA25230C2296}.Release|x86.Build.0 = Release|Any CPU {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Debug|x64.ActiveCfg = Debug|Any CPU + {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Debug|x64.Build.0 = Debug|Any CPU + {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Debug|x86.ActiveCfg = Debug|Any CPU + {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Debug|x86.Build.0 = Debug|Any CPU {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Release|Any CPU.Build.0 = Release|Any CPU + {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Release|x64.ActiveCfg = Release|Any CPU + {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Release|x64.Build.0 = Release|Any CPU + {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Release|x86.ActiveCfg = Release|Any CPU + {8CB5FF58-FF95-43B9-9064-9ACE9525866F}.Release|x86.Build.0 = Release|Any CPU {9ECBEA14-B79F-4F92-9266-495C03A32571}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9ECBEA14-B79F-4F92-9266-495C03A32571}.Debug|Any CPU.Build.0 = Debug|Any CPU {9ECBEA14-B79F-4F92-9266-495C03A32571}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {9ECBEA14-B79F-4F92-9266-495C03A32571}.Debug|x64.ActiveCfg = Debug|Any CPU + {9ECBEA14-B79F-4F92-9266-495C03A32571}.Debug|x64.Build.0 = Debug|Any CPU + {9ECBEA14-B79F-4F92-9266-495C03A32571}.Debug|x86.ActiveCfg = Debug|Any CPU + {9ECBEA14-B79F-4F92-9266-495C03A32571}.Debug|x86.Build.0 = Debug|Any CPU {9ECBEA14-B79F-4F92-9266-495C03A32571}.Release|Any CPU.ActiveCfg = Release|Any CPU {9ECBEA14-B79F-4F92-9266-495C03A32571}.Release|Any CPU.Build.0 = Release|Any CPU {9ECBEA14-B79F-4F92-9266-495C03A32571}.Release|Any CPU.Deploy.0 = Release|Any CPU + {9ECBEA14-B79F-4F92-9266-495C03A32571}.Release|x64.ActiveCfg = Release|Any CPU + {9ECBEA14-B79F-4F92-9266-495C03A32571}.Release|x64.Build.0 = Release|Any CPU + {9ECBEA14-B79F-4F92-9266-495C03A32571}.Release|x86.ActiveCfg = Release|Any CPU + {9ECBEA14-B79F-4F92-9266-495C03A32571}.Release|x86.Build.0 = Release|Any CPU {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Debug|x64.ActiveCfg = Debug|Any CPU + {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Debug|x64.Build.0 = Debug|Any CPU + {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Debug|x86.ActiveCfg = Debug|Any CPU + {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Debug|x86.Build.0 = Debug|Any CPU {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Release|Any CPU.ActiveCfg = Release|Any CPU {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Release|Any CPU.Build.0 = Release|Any CPU + {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Release|x64.ActiveCfg = Release|Any CPU + {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Release|x64.Build.0 = Release|Any CPU + {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Release|x86.ActiveCfg = Release|Any CPU + {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}.Release|x86.Build.0 = Release|Any CPU {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Debug|x64.ActiveCfg = Debug|Any CPU + {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Debug|x64.Build.0 = Debug|Any CPU + {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Debug|x86.ActiveCfg = Debug|Any CPU + {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Debug|x86.Build.0 = Debug|Any CPU {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Release|Any CPU.ActiveCfg = Release|Any CPU {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Release|Any CPU.Build.0 = Release|Any CPU + {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Release|x64.ActiveCfg = Release|Any CPU + {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Release|x64.Build.0 = Release|Any CPU + {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Release|x86.ActiveCfg = Release|Any CPU + {6CB00820-A66B-43E5-8785-ED456C6E9F39}.Release|x86.Build.0 = Release|Any CPU {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|x64.ActiveCfg = Debug|Any CPU + {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|x64.Build.0 = Debug|Any CPU + {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|x86.ActiveCfg = Debug|Any CPU + {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Debug|x86.Build.0 = Debug|Any CPU {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|Any CPU.ActiveCfg = Release|Any CPU {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|Any CPU.Build.0 = Release|Any CPU + {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|x64.ActiveCfg = Release|Any CPU + {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|x64.Build.0 = Release|Any CPU + {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|x86.ActiveCfg = Release|Any CPU + {94BD81F7-B06F-4295-9636-F8A3B6BDC762}.Release|x86.Build.0 = Release|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Debug|x64.ActiveCfg = Debug|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Debug|x64.Build.0 = Debug|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Debug|x86.ActiveCfg = Debug|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Debug|x86.Build.0 = Debug|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Release|Any CPU.Build.0 = Release|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Release|x64.ActiveCfg = Release|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Release|x64.Build.0 = Release|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Release|x86.ActiveCfg = Release|Any CPU + {3220BC41-7332-49A7-9286-5131477808EF}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -253,8 +516,14 @@ Global {D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF} = {EFBC4DC0-DBFF-4DAA-B0B8-6D0CB02A25F5} {6CB00820-A66B-43E5-8785-ED456C6E9F39} = {EFBC4DC0-DBFF-4DAA-B0B8-6D0CB02A25F5} {94BD81F7-B06F-4295-9636-F8A3B6BDC762} = {EFBC4DC0-DBFF-4DAA-B0B8-6D0CB02A25F5} + {3220BC41-7332-49A7-9286-5131477808EF} = {0AB3BF05-4346-4AA6-1389-037BE0695223} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8643CD20-B195-4919-8135-27549488237E} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + tests\Mono.Android-Tests\Mono.Android-Test.Shared.projitems*{0ab4956e-6fb9-4da0-9d49-ab65a3ff403a}*SharedItemsImports = 13 + tests\Mono.Android-Tests\Mono.Android-Test.Shared.projitems*{40ead437-216b-4df4-8258-3f47e1672c3a}*SharedItemsImports = 4 + tests\Mono.Android-Tests\Mono.Android-Test.Shared.projitems*{9ecbea14-b79f-4f92-9266-495c03a32571}*SharedItemsImports = 4 + EndGlobalSection EndGlobal diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets index 28a1dfedeab..881d0eb5d73 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets @@ -131,7 +131,6 @@ true false false - false true false true @@ -156,6 +155,8 @@ false + + false false false diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj b/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj index 51457b1d5b1..915a4ae7507 100644 --- a/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj @@ -49,6 +49,7 @@ true <_DefaultValueAttributeSupport Condition="'$(TrimMode)' == 'full'">true + true @@ -61,6 +62,7 @@ + @@ -103,6 +105,7 @@ + @@ -227,6 +230,7 @@ + diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/System/StartupHookTest.cs b/tests/Mono.Android-Tests/Mono.Android-Tests/System/StartupHookTest.cs new file mode 100644 index 00000000000..7c96bdfd69c --- /dev/null +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/System/StartupHookTest.cs @@ -0,0 +1,24 @@ +using System; +using System.Reflection; +using NUnit.Framework; + +namespace SystemTests +{ + [TestFixture] + [Category ("FOO")] + public class StartupHookTest + { + [Test] + public void IsInitialized () + { + var type = Type.GetType ("StartupHook, StartupHook", throwOnError: true); + Assert.IsNotNull (type, "StartupHook type should be loaded"); + + var property = type.GetProperty ("IsInitialized", BindingFlags.Public | BindingFlags.Static); + Assert.IsNotNull (property, "IsInitialized property should exist"); + + var value = (bool) property.GetValue (null); + Assert.IsTrue (value, "StartupHook.Initialize() should have been called"); + } + } +} diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/env.txt b/tests/Mono.Android-Tests/Mono.Android-Tests/env.txt index cb897b79238..d3141692f53 100644 --- a/tests/Mono.Android-Tests/Mono.Android-Tests/env.txt +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/env.txt @@ -1,3 +1,4 @@ # Environment Variables and system properties # debug.mono.log=gref,default debug.mono.debug=1 +DOTNET_STARTUP_HOOKS=StartupHook diff --git a/tests/StartupHook/StartupHook.cs b/tests/StartupHook/StartupHook.cs new file mode 100644 index 00000000000..32e61b4ae43 --- /dev/null +++ b/tests/StartupHook/StartupHook.cs @@ -0,0 +1,13 @@ +using System; + +internal static class StartupHook +{ + public static bool IsInitialized { get; private set; } + + public static void Initialize () + { + Console.WriteLine ("StartupHook.Initialize() called"); + + IsInitialized = true; + } +} diff --git a/tests/StartupHook/StartupHook.csproj b/tests/StartupHook/StartupHook.csproj new file mode 100644 index 00000000000..f132be73696 --- /dev/null +++ b/tests/StartupHook/StartupHook.csproj @@ -0,0 +1,10 @@ + + + + $(DotNetAndroidTargetFramework) + $(AndroidMinimumDotNetApiLevel) + false + false + + + From 17176cd1c91223130aae937980789fe63c71dc65 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Thu, 8 Jan 2026 14:43:56 -0600 Subject: [PATCH 2/3] [coreclr] call `System.StartupHookProvider.ProcessStartupHooks()` --- .../Android.Runtime/JNIEnvInit.cs | 39 ++++++++++++++++++- .../RuntimeFeature.cs | 7 ++++ .../System/StartupHookTest.cs | 1 - 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/Mono.Android/Android.Runtime/JNIEnvInit.cs b/src/Mono.Android/Android.Runtime/JNIEnvInit.cs index 8314aa2708c..b8aa2e2507d 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnvInit.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnvInit.cs @@ -165,13 +165,50 @@ internal static unsafe void Initialize (JnienvInitializeArgs* args) } args->propagateUncaughtExceptionFn = (IntPtr)(delegate* unmanaged)&PropagateUncaughtException; - + RunStartupHooksIfNeeded (); SetSynchronizationContext (); } [DllImport (RuntimeConstants.InternalDllName, CallingConvention = CallingConvention.Cdecl)] static extern unsafe void xamarin_app_init (IntPtr env, delegate* unmanaged get_function_pointer); + static void RunStartupHooksIfNeeded () + { + // Return if startup hooks are disabled or not CoreCLR + if (!RuntimeFeature.IsCoreClrRuntime) + return; + if (!RuntimeFeature.StartupHookSupport) + return; + + RunStartupHooks (); + } + + [RequiresUnreferencedCode ("Uses reflection to access System.StartupHookProvider.")] + static void RunStartupHooks () + { + const string typeName = "System.StartupHookProvider"; + const string methodName = "ProcessStartupHooks"; + + var type = typeof(object).Assembly.GetType (typeName, throwOnError: false); + if (type is null) { + RuntimeNativeMethods.monodroid_log (LogLevel.Warn, LogCategories.Default, + $"Could not load type '{typeName}'. Skipping startup hooks."); + return; + } + + var method = type.GetMethod (methodName, + BindingFlags.NonPublic | BindingFlags.Static, null, [ typeof(string) ], null); + if (method is null) { + RuntimeNativeMethods.monodroid_log (LogLevel.Warn, LogCategories.Default, + $"Could not load method '{typeName}.{methodName}'. Skipping startup hooks."); + return; + } + + // Pass empty string for diagnosticStartupHooks parameter + // The method will read STARTUP_HOOKS from AppContext internally + method.Invoke (null, [ "" ]); + } + static void SetSynchronizationContext () => SynchronizationContext.SetSynchronizationContext (Android.App.Application.SynchronizationContext); } diff --git a/src/Mono.Android/Microsoft.Android.Runtime/RuntimeFeature.cs b/src/Mono.Android/Microsoft.Android.Runtime/RuntimeFeature.cs index 4924b259ef4..24bedf65bed 100644 --- a/src/Mono.Android/Microsoft.Android.Runtime/RuntimeFeature.cs +++ b/src/Mono.Android/Microsoft.Android.Runtime/RuntimeFeature.cs @@ -9,8 +9,10 @@ static class RuntimeFeature const bool IsMonoRuntimeEnabledByDefault = true; const bool IsCoreClrRuntimeEnabledByDefault = false; const bool IsAssignableFromCheckEnabledByDefault = true; + const bool StartupHookSupportEnabledByDefault = true; const string FeatureSwitchPrefix = "Microsoft.Android.Runtime.RuntimeFeature."; + const string StartupHookProviderSwitch = "System.StartupHookProvider.IsSupported"; [FeatureSwitchDefinition ($"{FeatureSwitchPrefix}{nameof (ManagedTypeMap)}")] internal static bool ManagedTypeMap { get; } = @@ -27,4 +29,9 @@ static class RuntimeFeature [FeatureSwitchDefinition ($"{FeatureSwitchPrefix}{nameof (IsAssignableFromCheck)}")] internal static bool IsAssignableFromCheck { get; } = AppContext.TryGetSwitch ($"{FeatureSwitchPrefix}{nameof (IsAssignableFromCheck)}", out bool isEnabled) ? isEnabled : IsAssignableFromCheckEnabledByDefault; + + [FeatureSwitchDefinition (StartupHookProviderSwitch)] + [FeatureGuard (typeof (RequiresUnreferencedCodeAttribute))] + internal static bool StartupHookSupport { get; } = + AppContext.TryGetSwitch (StartupHookProviderSwitch, out bool isEnabled) ? isEnabled : StartupHookSupportEnabledByDefault; } diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/System/StartupHookTest.cs b/tests/Mono.Android-Tests/Mono.Android-Tests/System/StartupHookTest.cs index 7c96bdfd69c..f58bf1b48ab 100644 --- a/tests/Mono.Android-Tests/Mono.Android-Tests/System/StartupHookTest.cs +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/System/StartupHookTest.cs @@ -5,7 +5,6 @@ namespace SystemTests { [TestFixture] - [Category ("FOO")] public class StartupHookTest { [Test] From eaaf0bd9a16385cd6fb25301d1fa87cbf648fa64 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 9 Jan 2026 10:38:33 -0600 Subject: [PATCH 3/3] "root" `StartupHook.dll` for the trimmer --- .../Mono.Android-Tests/Mono.Android.NET-Tests.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj b/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj index 915a4ae7507..8047c3713ef 100644 --- a/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj @@ -70,6 +70,7 @@ + <_AndroidRemapMembers Include="Remaps.xml" /> <_AndroidRemapMembers Include="IsAssignableFromRemaps.xml" Condition=" '$(_AndroidIsAssignableFromCheck)' == 'false' " />