From 19654f30df0fa1f145f48d2e72fd148fd16b16c4 Mon Sep 17 00:00:00 2001 From: David Wengier Date: Tue, 20 Feb 2024 11:06:18 +1100 Subject: [PATCH 1/6] Create an export provider for services to discover other services --- .../RazorServiceFactoryBase.ExportProvider.cs | 30 +++++++++++++++++++ .../RazorServiceFactoryBase.cs | 10 +++++-- .../RemoteTagHelperDeltaProvider.cs | 2 ++ .../RemoteTagHelperProviderService.cs | 6 ++-- .../RemoteTagHelperProviderServiceFactory.cs | 5 ++-- 5 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.ExportProvider.cs diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.ExportProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.ExportProvider.cs new file mode 100644 index 00000000000..a89afc88009 --- /dev/null +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.ExportProvider.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT license. See License.txt in the project root for license information. + +using System.Collections.Immutable; +using System.Reflection; +using System.Threading.Tasks; +using Microsoft.VisualStudio.Composition; + +namespace Microsoft.CodeAnalysis.Remote.Razor; + +internal abstract partial class RazorServiceFactoryBase +{ + internal static readonly ImmutableArray RemoteHostAssemblies = [typeof(RazorServiceFactoryBase).Assembly]; + + private static readonly ExportProvider _exportProvider = CreateExportProvider(); + + // Inspired by https://github.com/dotnet/roslyn/blob/25aa74d725e801b8232dbb3e5abcda0fa72da8c5/src/Workspaces/Remote/ServiceHub/Host/RemoteWorkspaceManager.cs#L77 + private static ExportProvider CreateExportProvider() + { + var resolver = Resolver.DefaultInstance; + var discovery = new AttributedPartDiscovery(resolver, isNonPublicSupported: true); // MEFv2 only + var parts = Task.Run(async () => await discovery.CreatePartsAsync(RemoteHostAssemblies).ConfigureAwait(false)).GetAwaiter().GetResult(); + var catalog = ComposableCatalog.Create(resolver).AddParts(parts); + + var configuration = CompositionConfiguration.Create(catalog); + var runtimeComposition = RuntimeComposition.CreateRuntimeComposition(configuration); + var exportProviderFactory = runtimeComposition.CreateExportProviderFactory(); + return exportProviderFactory.CreateExportProvider(); + } +} diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs index 59d8b07d3d2..08d6b88c01e 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs @@ -9,6 +9,7 @@ using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.ServiceHub.Framework; using Microsoft.ServiceHub.Framework.Services; +using Microsoft.VisualStudio.Composition; using Nerdbank.Streams; namespace Microsoft.CodeAnalysis.Remote.Razor; @@ -19,7 +20,7 @@ namespace Microsoft.CodeAnalysis.Remote.Razor; /// /// Implementors of (and thus this class) MUST provide a parameterless constructor or ServiceHub will fail to construct them. /// -internal abstract class RazorServiceFactoryBase : IServiceHubServiceFactory where TService : class +internal abstract partial class RazorServiceFactoryBase : IServiceHubServiceFactory where TService : class { private readonly RazorServiceDescriptorsWrapper _razorServiceDescriptors; private ITelemetryReporter? _telemetryReporter; @@ -55,7 +56,10 @@ internal TService Create(IDuplexPipe pipe, IServiceBroker serviceBroker) var descriptor = _razorServiceDescriptors.GetDescriptorForServiceFactory(typeof(TService)); var serverConnection = descriptor.ConstructRpcConnection(pipe); - var service = CreateService(serviceBroker, _telemetryReporter ?? NoOpTelemetryReporter.Instance); + var service = CreateService(serviceBroker, + // TODO: This seems to always be null. Suspect this was intended to be something different. + _telemetryReporter ?? NoOpTelemetryReporter.Instance, + _exportProvider); serverConnection.AddLocalRpcTarget(service); serverConnection.StartListening(); @@ -63,5 +67,5 @@ internal TService Create(IDuplexPipe pipe, IServiceBroker serviceBroker) return service; } - protected abstract TService CreateService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter); + protected abstract TService CreateService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter, ExportProvider exportProvider); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperDeltaProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperDeltaProvider.cs index 936d5ce6f49..8a00a91192d 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperDeltaProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperDeltaProvider.cs @@ -2,11 +2,13 @@ // Licensed under the MIT license. See License.txt in the project root for license information. using System.Collections.Immutable; +using System.Composition; using Microsoft.AspNetCore.Razor.Serialization; using Microsoft.AspNetCore.Razor.Utilities; namespace Microsoft.CodeAnalysis.Remote.Razor; +[Export(typeof(RemoteTagHelperDeltaProvider)), Shared] internal class RemoteTagHelperDeltaProvider { private readonly TagHelperResultCache _resultCache = new(); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderService.cs index 6cceaff9096..0fa723e3e4b 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderService.cs @@ -4,6 +4,7 @@ using System.Collections.Immutable; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.AspNetCore.Razor.Serialization; @@ -12,6 +13,7 @@ using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.ExternalAccess.Razor.Api; using Microsoft.ServiceHub.Framework; +using Microsoft.VisualStudio.Composition; namespace Microsoft.CodeAnalysis.Remote.Razor; @@ -20,11 +22,11 @@ internal sealed class RemoteTagHelperProviderService : RazorServiceBase, IRemote private readonly RemoteTagHelperResolver _tagHelperResolver; private readonly RemoteTagHelperDeltaProvider _tagHelperDeltaProvider; - internal RemoteTagHelperProviderService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter) + internal RemoteTagHelperProviderService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter, ExportProvider exportProvider) : base(serviceBroker) { _tagHelperResolver = new RemoteTagHelperResolver(telemetryReporter); - _tagHelperDeltaProvider = new RemoteTagHelperDeltaProvider(); + _tagHelperDeltaProvider = exportProvider.GetExportedValue().AssumeNotNull(); } public ValueTask FetchTagHelpersAsync( diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderServiceFactory.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderServiceFactory.cs index b21d65330d4..7e82744047c 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderServiceFactory.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderServiceFactory.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Razor.Telemetry; using Microsoft.ServiceHub.Framework; +using Microsoft.VisualStudio.Composition; namespace Microsoft.CodeAnalysis.Remote.Razor; @@ -14,6 +15,6 @@ public RemoteTagHelperProviderServiceFactory() { } - protected override IRemoteTagHelperProviderService CreateService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter) - => new RemoteTagHelperProviderService(serviceBroker, telemetryReporter); + protected override IRemoteTagHelperProviderService CreateService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter, ExportProvider exportProvider) + => new RemoteTagHelperProviderService(serviceBroker, telemetryReporter, exportProvider); } From df3b5eae383433d008d80075967e83822528156d Mon Sep 17 00:00:00 2001 From: David Wengier Date: Tue, 20 Feb 2024 11:05:37 +1100 Subject: [PATCH 2/6] Add launch profile for debugging the OOP service --- .gitignore | 1 - .../SampleApp/Properties/launchSettings.json | 12 ++++++++++ .../.gitignore | 1 - .../Properties/launchSettings.json | 23 +++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/Compiler/perf/Microsoft.AspNetCore.Razor.Microbenchmarks.Generator/SampleApp/Properties/launchSettings.json delete mode 100644 src/Razor/src/Microsoft.VisualStudio.RazorExtension/.gitignore create mode 100644 src/Razor/src/Microsoft.VisualStudio.RazorExtension/Properties/launchSettings.json diff --git a/.gitignore b/.gitignore index f82cc9bd59b..c6883ed69eb 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ *.user *.userosscache *.sln.docstates -launchSettings.json # Build results artifacts/ diff --git a/src/Compiler/perf/Microsoft.AspNetCore.Razor.Microbenchmarks.Generator/SampleApp/Properties/launchSettings.json b/src/Compiler/perf/Microsoft.AspNetCore.Razor.Microbenchmarks.Generator/SampleApp/Properties/launchSettings.json new file mode 100644 index 00000000000..b26bcffee09 --- /dev/null +++ b/src/Compiler/perf/Microsoft.AspNetCore.Razor.Microbenchmarks.Generator/SampleApp/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "SampleApp": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:53331;http://localhost:53332" + } + } +} \ No newline at end of file diff --git a/src/Razor/src/Microsoft.VisualStudio.RazorExtension/.gitignore b/src/Razor/src/Microsoft.VisualStudio.RazorExtension/.gitignore deleted file mode 100644 index 5f282702bb0..00000000000 --- a/src/Razor/src/Microsoft.VisualStudio.RazorExtension/.gitignore +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Razor/src/Microsoft.VisualStudio.RazorExtension/Properties/launchSettings.json b/src/Razor/src/Microsoft.VisualStudio.RazorExtension/Properties/launchSettings.json new file mode 100644 index 00000000000..63a3c7f6e0c --- /dev/null +++ b/src/Razor/src/Microsoft.VisualStudio.RazorExtension/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "profiles": { + "Razor": { + "commandName": "Project", + "environmentVariables": { + "CPS_DiagnosticRuntime": "1", + "CPS_MetricsCollection": "1", + "ServiceHubTraceLevel": "All", + }, + "nativeDebugging": true + }, + "Razor (with ServiceHub debugging)": { + "commandName": "Project", + "environmentVariables": { + "CPS_DiagnosticRuntime": "1", + "CPS_MetricsCollection": "1", + "ServiceHubTraceLevel": "All", + "SERVICEHUBDEBUGHOSTONSTARTUP": "ServiceHub.RoslynCodeAnalysisService.exe" + }, + "nativeDebugging": true + } + } +} \ No newline at end of file From ca941660ab5bccaa76c86703de1b1c3a056a052f Mon Sep 17 00:00:00 2001 From: David Wengier Date: Tue, 20 Feb 2024 15:14:53 +1100 Subject: [PATCH 3/6] Remove telemetry reporter that will always be null --- .../RazorServiceFactoryBase.cs | 10 ++-------- .../RemoteTagHelperProviderService.cs | 5 ++--- .../RemoteTagHelperProviderServiceFactory.cs | 5 ++--- .../RemoteTagHelperResolver.cs | 7 ++++--- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs index 08d6b88c01e..cd24c0ac426 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs @@ -23,7 +23,6 @@ namespace Microsoft.CodeAnalysis.Remote.Razor; internal abstract partial class RazorServiceFactoryBase : IServiceHubServiceFactory where TService : class { private readonly RazorServiceDescriptorsWrapper _razorServiceDescriptors; - private ITelemetryReporter? _telemetryReporter; /// /// @@ -46,8 +45,6 @@ public Task CreateAsync( // Dispose the AuthorizationServiceClient since we won't be using it authorizationServiceClient?.Dispose(); - _telemetryReporter = (ITelemetryReporter)hostProvidedServices.GetService(typeof(ITelemetryReporter)); - return Task.FromResult((object)Create(stream.UsePipe(), serviceBroker)); } @@ -56,10 +53,7 @@ internal TService Create(IDuplexPipe pipe, IServiceBroker serviceBroker) var descriptor = _razorServiceDescriptors.GetDescriptorForServiceFactory(typeof(TService)); var serverConnection = descriptor.ConstructRpcConnection(pipe); - var service = CreateService(serviceBroker, - // TODO: This seems to always be null. Suspect this was intended to be something different. - _telemetryReporter ?? NoOpTelemetryReporter.Instance, - _exportProvider); + var service = CreateService(serviceBroker, _exportProvider); serverConnection.AddLocalRpcTarget(service); serverConnection.StartListening(); @@ -67,5 +61,5 @@ internal TService Create(IDuplexPipe pipe, IServiceBroker serviceBroker) return service; } - protected abstract TService CreateService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter, ExportProvider exportProvider); + protected abstract TService CreateService(IServiceBroker serviceBroker, ExportProvider exportProvider); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderService.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderService.cs index 0fa723e3e4b..02f906861ec 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderService.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderService.cs @@ -8,7 +8,6 @@ using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.PooledObjects; using Microsoft.AspNetCore.Razor.Serialization; -using Microsoft.AspNetCore.Razor.Telemetry; using Microsoft.AspNetCore.Razor.Utilities; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.CodeAnalysis.ExternalAccess.Razor.Api; @@ -22,10 +21,10 @@ internal sealed class RemoteTagHelperProviderService : RazorServiceBase, IRemote private readonly RemoteTagHelperResolver _tagHelperResolver; private readonly RemoteTagHelperDeltaProvider _tagHelperDeltaProvider; - internal RemoteTagHelperProviderService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter, ExportProvider exportProvider) + internal RemoteTagHelperProviderService(IServiceBroker serviceBroker, ExportProvider exportProvider) : base(serviceBroker) { - _tagHelperResolver = new RemoteTagHelperResolver(telemetryReporter); + _tagHelperResolver = exportProvider.GetExportedValue().AssumeNotNull(); _tagHelperDeltaProvider = exportProvider.GetExportedValue().AssumeNotNull(); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderServiceFactory.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderServiceFactory.cs index 7e82744047c..47f2566f076 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderServiceFactory.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperProviderServiceFactory.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT license. See License.txt in the project root for license information. -using Microsoft.AspNetCore.Razor.Telemetry; using Microsoft.ServiceHub.Framework; using Microsoft.VisualStudio.Composition; @@ -15,6 +14,6 @@ public RemoteTagHelperProviderServiceFactory() { } - protected override IRemoteTagHelperProviderService CreateService(IServiceBroker serviceBroker, ITelemetryReporter telemetryReporter, ExportProvider exportProvider) - => new RemoteTagHelperProviderService(serviceBroker, telemetryReporter, exportProvider); + protected override IRemoteTagHelperProviderService CreateService(IServiceBroker serviceBroker, ExportProvider exportProvider) + => new RemoteTagHelperProviderService(serviceBroker, exportProvider); } diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperResolver.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperResolver.cs index 1151149a062..b483b8c2039 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperResolver.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RemoteTagHelperResolver.cs @@ -4,23 +4,24 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Composition; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.ProjectEngineHost; -using Microsoft.AspNetCore.Razor.Telemetry; namespace Microsoft.CodeAnalysis.Remote.Razor; -internal class RemoteTagHelperResolver(ITelemetryReporter telemetryReporter) +[Export(typeof(RemoteTagHelperResolver)), Shared] +internal class RemoteTagHelperResolver() { /// /// A map of configuration names to instances. /// private static readonly Dictionary s_configurationNameToFactoryMap = CreateConfigurationNameToFactoryMap(); - private readonly CompilationTagHelperResolver _compilationTagHelperResolver = new(telemetryReporter); + private readonly CompilationTagHelperResolver _compilationTagHelperResolver = new(telemetryReporter: null); private static Dictionary CreateConfigurationNameToFactoryMap() { From 7bde481f6d7bd2e6430bbb2bf84cbcfe6a7099a5 Mon Sep 17 00:00:00 2001 From: David Wengier Date: Tue, 20 Feb 2024 15:15:53 +1100 Subject: [PATCH 4/6] Initialize asyncronously --- .../RazorServiceFactoryBase.ExportProvider.cs | 11 +++++++---- .../RazorServiceFactoryBase.cs | 9 +++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.ExportProvider.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.ExportProvider.cs index a89afc88009..0a6779443c2 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.ExportProvider.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.ExportProvider.cs @@ -5,6 +5,7 @@ using System.Reflection; using System.Threading.Tasks; using Microsoft.VisualStudio.Composition; +using Microsoft.VisualStudio.Threading; namespace Microsoft.CodeAnalysis.Remote.Razor; @@ -12,17 +13,19 @@ internal abstract partial class RazorServiceFactoryBase { internal static readonly ImmutableArray RemoteHostAssemblies = [typeof(RazorServiceFactoryBase).Assembly]; - private static readonly ExportProvider _exportProvider = CreateExportProvider(); +#pragma warning disable VSTHRD012 // Provide JoinableTaskFactory where allowed + private static readonly AsyncLazy s_exportProviderLazy = new(GetExportProviderAsync); +#pragma warning restore VSTHRD012 // Provide JoinableTaskFactory where allowed // Inspired by https://github.com/dotnet/roslyn/blob/25aa74d725e801b8232dbb3e5abcda0fa72da8c5/src/Workspaces/Remote/ServiceHub/Host/RemoteWorkspaceManager.cs#L77 - private static ExportProvider CreateExportProvider() + private static async Task GetExportProviderAsync() { var resolver = Resolver.DefaultInstance; var discovery = new AttributedPartDiscovery(resolver, isNonPublicSupported: true); // MEFv2 only - var parts = Task.Run(async () => await discovery.CreatePartsAsync(RemoteHostAssemblies).ConfigureAwait(false)).GetAwaiter().GetResult(); + var parts = await discovery.CreatePartsAsync(RemoteHostAssemblies).ConfigureAwait(false); var catalog = ComposableCatalog.Create(resolver).AddParts(parts); - var configuration = CompositionConfiguration.Create(catalog); + var configuration = CompositionConfiguration.Create(catalog).ThrowOnErrors(); var runtimeComposition = RuntimeComposition.CreateRuntimeComposition(configuration); var exportProviderFactory = runtimeComposition.CreateExportProviderFactory(); return exportProviderFactory.CreateExportProvider(); diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs index cd24c0ac426..1f7bb6ba6c3 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/RazorServiceFactoryBase.cs @@ -5,7 +5,6 @@ using System.IO; using System.IO.Pipelines; using System.Threading.Tasks; -using Microsoft.AspNetCore.Razor.Telemetry; using Microsoft.CodeAnalysis.ExternalAccess.Razor; using Microsoft.ServiceHub.Framework; using Microsoft.ServiceHub.Framework.Services; @@ -45,15 +44,17 @@ public Task CreateAsync( // Dispose the AuthorizationServiceClient since we won't be using it authorizationServiceClient?.Dispose(); - return Task.FromResult((object)Create(stream.UsePipe(), serviceBroker)); + return CreateAsync(stream.UsePipe(), serviceBroker); } - internal TService Create(IDuplexPipe pipe, IServiceBroker serviceBroker) + private async Task CreateAsync(IDuplexPipe pipe, IServiceBroker serviceBroker) { var descriptor = _razorServiceDescriptors.GetDescriptorForServiceFactory(typeof(TService)); var serverConnection = descriptor.ConstructRpcConnection(pipe); - var service = CreateService(serviceBroker, _exportProvider); + var exportProvider = await s_exportProviderLazy.GetValueAsync().ConfigureAwait(false); + + var service = CreateService(serviceBroker, exportProvider); serverConnection.AddLocalRpcTarget(service); serverConnection.StartListening(); From 1ae2180bac7ad140f04b2e312797006c6b56aaef Mon Sep 17 00:00:00 2001 From: David Wengier Date: Tue, 20 Feb 2024 15:23:36 +1100 Subject: [PATCH 5/6] Bring back telemetry properly, via DI --- .../Microsoft.CodeAnalysis.Remote.Razor.csproj | 4 ++++ .../RemoteTagHelperResolver.cs | 6 ++++-- .../Telemetry/OutOfProcessTelemetryReporter.cs | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Telemetry/OutOfProcessTelemetryReporter.cs diff --git a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj index bde79e4e5e4..8d41644ee2a 100644 --- a/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj +++ b/src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj @@ -23,6 +23,10 @@ + + + +