From f0fc5985113e6332f6bad80aa8a943404ea85737 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 24 Jan 2019 14:26:12 -0800 Subject: [PATCH] Resurrect Blazor VSIX (#6779) * Remove Blazor.LanguageServices The text-view-listener was the only thing here and it's not needed anymore now that these features are build into our main VS payload. We won't have any more code to put in this project because it's this VSIX is pretty temporary. * Remove reference to ProjectSystem We don't need this reference, and it's got some breaking changes between 15 and 16 - rahter then mess with nuget sources for vs16 packages, I'm just going to drop the dependency * Remove unused cruft * Target net472 * Add Blazor VSIX to build * Add Extension to .sln * Use AsyncPackage * Update and streamline references * Update manifest for 16.0 * Pack Templates before building VSIX * Fix version of templates --- build/repo.props | 7 +- eng/ProjectReferences.props | 1 - .../src/AutoRebuild/AutoRebuildService.cs | 10 +- .../src/AutoRebuild/BuildEventsWatcher.cs | 21 +- .../BlazorExtension/src/BlazorPackage.cs | 38 ++-- ...rosoft.VisualStudio.BlazorExtension.csproj | 89 ++------ .../src/Properties/AssemblyInfo.cs | 17 -- .../BlazorExtension/src/Templates.pkgdef | 2 +- .../src/source.extension.vsixmanifest | 10 +- ...isualStudio.LanguageServices.Blazor.csproj | 20 -- .../src/RazorTextViewListener.cs | 213 ------------------ .../.template.config.src/template.json | 8 +- .../.template.config.src/template.json | 8 +- .../.template.config.src/template.json | 8 +- src/Components/Components.sln | 34 +-- 15 files changed, 99 insertions(+), 387 deletions(-) delete mode 100644 src/Components/Blazor/BlazorExtension/src/Properties/AssemblyInfo.cs delete mode 100644 src/Components/Blazor/BlazorLanguageServices/src/Microsoft.VisualStudio.LanguageServices.Blazor.csproj delete mode 100644 src/Components/Blazor/BlazorLanguageServices/src/RazorTextViewListener.cs diff --git a/build/repo.props b/build/repo.props index 02493207af..ce306409ff 100644 --- a/build/repo.props +++ b/build/repo.props @@ -37,14 +37,9 @@ - - - - diff --git a/src/Components/Blazor/BlazorExtension/src/AutoRebuild/AutoRebuildService.cs b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/AutoRebuildService.cs index 49977fccfa..f3aa9b195b 100644 --- a/src/Components/Blazor/BlazorExtension/src/AutoRebuild/AutoRebuildService.cs +++ b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/AutoRebuildService.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.VisualStudio.Shell.Interop; @@ -33,12 +33,12 @@ namespace Microsoft.VisualStudio.BlazorExtension public void Listen() { - AddBuildServiceNamedPipeServer(); + _ = AddBuildServiceNamedPipeServerAsync(); } - private void AddBuildServiceNamedPipeServer() + private Task AddBuildServiceNamedPipeServerAsync() { - Task.Factory.StartNew(async () => + return Task.Factory.StartNew(async () => { try { @@ -69,7 +69,7 @@ namespace Microsoft.VisualStudio.BlazorExtension // As soon as we receive a connection, spin up another background // listener to wait for the next connection await serverPipe.WaitForConnectionAsync(); - AddBuildServiceNamedPipeServer(); + _ = AddBuildServiceNamedPipeServerAsync(); await HandleRequestAsync(serverPipe, isServerElevated); } diff --git a/src/Components/Blazor/BlazorExtension/src/AutoRebuild/BuildEventsWatcher.cs b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/BuildEventsWatcher.cs index 1c56be2254..e05f05f28f 100644 --- a/src/Components/Blazor/BlazorExtension/src/AutoRebuild/BuildEventsWatcher.cs +++ b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/BuildEventsWatcher.cs @@ -1,10 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.VisualStudio.ProjectSystem.Properties; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; @@ -74,14 +73,16 @@ namespace Microsoft.VisualStudio.BlazorExtension public int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, ref int pfCancel) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (IsBlazorProject(pHierProj)) { // This method runs both for manually-invoked builds and for builds triggered automatically // by PerformNewBuildAsync(). In the case where it's a manually-invoked build, make sure // there's an in-progress BuildInfo so that if there are further builds requests while the // build is still in progress we can join them onto this existing build. - var ctx = (IVsBrowseObjectContext)pCfgProj; - var projectPath = ctx.UnconfiguredProject.FullPath; + + var projectPath = GetProjectPath(pHierProj); lock (mostRecentBuildInfosLock) { var hasBuildInProgress = @@ -99,11 +100,12 @@ namespace Microsoft.VisualStudio.BlazorExtension public int UpdateProjectCfg_Done(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, int fSuccess, int fCancel) { + ThreadHelper.ThrowIfNotOnUIThread(); + if (IsBlazorProject(pHierProj)) { var buildResult = fSuccess == 1; - var ctx = (IVsBrowseObjectContext)pCfgProj; - var projectPath = ctx.UnconfiguredProject.FullPath; + var projectPath = GetProjectPath(pHierProj); // Mark pending build info as completed BuildInfo foundInfo = null; @@ -160,6 +162,13 @@ namespace Microsoft.VisualStudio.BlazorExtension private static bool IsBlazorProject(IVsHierarchy pHierProj) => pHierProj.IsCapabilityMatch(BlazorProjectCapability); + private static string GetProjectPath(IVsHierarchy pHierProj) + { + ThreadHelper.ThrowIfNotOnUIThread(); + ErrorHandler.ThrowOnFailure(((IVsProject)pHierProj).GetMkDocument((uint)VSConstants.VSITEMID.Root, out var projectPath), VSConstants.E_NOTIMPL); + return projectPath; + } + class BuildInfo { public DateTime StartTime { get; } diff --git a/src/Components/Blazor/BlazorExtension/src/BlazorPackage.cs b/src/Components/Blazor/BlazorExtension/src/BlazorPackage.cs index f5ea8de8a4..fd956856ac 100644 --- a/src/Components/Blazor/BlazorExtension/src/BlazorPackage.cs +++ b/src/Components/Blazor/BlazorExtension/src/BlazorPackage.cs @@ -1,40 +1,44 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; +using Task = System.Threading.Tasks.Task; namespace Microsoft.VisualStudio.BlazorExtension { // We mainly have a package so we can have an "About" dialog entry. - [PackageRegistration(UseManagedResourcesOnly = true)] + [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] [AboutDialogInfo(PackageGuidString, "ASP.NET Core Blazor Language Services", "#110", "112")] [Guid(BlazorPackage.PackageGuidString)] - [ProvideAutoLoad(UIContextGuids80.SolutionExists)] - public sealed class BlazorPackage : Package + [ProvideAutoLoad(UIContextGuids80.SolutionExists, PackageAutoLoadFlags.BackgroundLoad)] + public sealed class BlazorPackage : AsyncPackage { public const string PackageGuidString = "d9fe04bc-57a7-4107-915e-3a5c2f9e19fb"; - protected override void Initialize() + protected async override Task InitializeAsync(CancellationToken cancellationToken, IProgress progress) { - base.Initialize(); - RegisterAutoRebuildService(); - } + await base.InitializeAsync(cancellationToken, progress); - private void RegisterAutoRebuildService() - { - ThreadHelper.ThrowIfNotOnUIThread(); + await JoinableTaskFactory.SwitchToMainThreadAsync(); // Create build watcher. No need to unadvise, as this only happens once anyway. - var solution = (IVsSolution)GetGlobalService(typeof(IVsSolution)); - var buildManager = (IVsSolutionBuildManager)GetService(typeof(SVsSolutionBuildManager)); - var buildWatcher = new BuildEventsWatcher(solution, buildManager); - var hr = buildManager.AdviseUpdateSolutionEvents(buildWatcher, out var cookie); - Marshal.ThrowExceptionForHR(hr); + var solution = (IVsSolution)await GetServiceAsync(typeof(IVsSolution)); + var buildManager = (IVsSolutionBuildManager)await GetServiceAsync(typeof(SVsSolutionBuildManager)); - new AutoRebuildService(buildWatcher).Listen(); + // According to the docs, this can happen if VS shuts down while our package is loading. + if (solution == null || buildManager == null) + { + var buildWatcher = new BuildEventsWatcher(solution, buildManager); + var hr = buildManager.AdviseUpdateSolutionEvents(buildWatcher, out var cookie); + Marshal.ThrowExceptionForHR(hr); + + new AutoRebuildService(buildWatcher).Listen(); + } } } } diff --git a/src/Components/Blazor/BlazorExtension/src/Microsoft.VisualStudio.BlazorExtension.csproj b/src/Components/Blazor/BlazorExtension/src/Microsoft.VisualStudio.BlazorExtension.csproj index d2085b87a3..fb61e760cd 100644 --- a/src/Components/Blazor/BlazorExtension/src/Microsoft.VisualStudio.BlazorExtension.csproj +++ b/src/Components/Blazor/BlazorExtension/src/Microsoft.VisualStudio.BlazorExtension.csproj @@ -8,10 +8,15 @@ true bin\$(Configuration)\ obj\$(Configuration)\ - + false + false + false + false + false + - - - true - ..\..\..\eng\AspNetCore.snk - - 15.7 - $(VsixVersion).$(BuildNumber) - $(VsixVersion).999999 - $(VsixVersion).ERROR-MISSING_BUILD_NUMBER + 16.0 + 424242.424242 + $(BuildNumberSuffix.Replace('-', '.')) + $(VsixVersionPrefix).$(VsixVersionSuffix) + Program @@ -71,7 +73,7 @@ true true - + ProjectTemplates\ @@ -89,25 +91,7 @@ - - - - false - - - - - - - + + diff --git a/src/Components/Blazor/BlazorExtension/src/Properties/AssemblyInfo.cs b/src/Components/Blazor/BlazorExtension/src/Properties/AssemblyInfo.cs deleted file mode 100644 index 1b380e53b4..0000000000 --- a/src/Components/Blazor/BlazorExtension/src/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.VisualStudio.Shell; - -// Add binding redirects for each assembly we ship in VS. This is required so that these assemblies show -// up in the Load context, which means that we can use ServiceHub and other nice things. -// -// The versions here need to match what the build is producing. If you change the version numbers -// for the referenced assemblies, this needs to change as well. -[assembly: ProvideBindingRedirection( - AssemblyName = "Microsoft.VisualStudio.LanguageServices.Blazor", - GenerateCodeBase = true, - PublicKeyToken = "", - OldVersionLowerBound = "0.0.0.0", - OldVersionUpperBound = "0.8.0.0", - NewVersion = "0.8.0.0")] \ No newline at end of file diff --git a/src/Components/Blazor/BlazorExtension/src/Templates.pkgdef b/src/Components/Blazor/BlazorExtension/src/Templates.pkgdef index 82cbd7d9f0..a5b41e7c29 100644 --- a/src/Components/Blazor/BlazorExtension/src/Templates.pkgdef +++ b/src/Components/Blazor/BlazorExtension/src/Templates.pkgdef @@ -1,2 +1,2 @@ -[$RootKey$\TemplateEngine\Templates\Blazor\0.2.0] +[$RootKey$\TemplateEngine\Templates\Blazor\0.8.0] "InstalledPath"="$PackageFolder$\ProjectTemplates" \ No newline at end of file diff --git a/src/Components/Blazor/BlazorExtension/src/source.extension.vsixmanifest b/src/Components/Blazor/BlazorExtension/src/source.extension.vsixmanifest index 838bc66b88..869961f74e 100644 --- a/src/Components/Blazor/BlazorExtension/src/source.extension.vsixmanifest +++ b/src/Components/Blazor/BlazorExtension/src/source.extension.vsixmanifest @@ -12,19 +12,17 @@ Content\WebConfiguration.png - + - + - - - + - + diff --git a/src/Components/Blazor/BlazorLanguageServices/src/Microsoft.VisualStudio.LanguageServices.Blazor.csproj b/src/Components/Blazor/BlazorLanguageServices/src/Microsoft.VisualStudio.LanguageServices.Blazor.csproj deleted file mode 100644 index 1eb532e806..0000000000 --- a/src/Components/Blazor/BlazorLanguageServices/src/Microsoft.VisualStudio.LanguageServices.Blazor.csproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - net461 - - false - - - - - - - - - - - - - - diff --git a/src/Components/Blazor/BlazorLanguageServices/src/RazorTextViewListener.cs b/src/Components/Blazor/BlazorLanguageServices/src/RazorTextViewListener.cs deleted file mode 100644 index a6344d515d..0000000000 --- a/src/Components/Blazor/BlazorLanguageServices/src/RazorTextViewListener.cs +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel.Composition; -using System.Linq; -using System.Reflection; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Host; -using Microsoft.CodeAnalysis.Razor; -using Microsoft.VisualStudio.Editor.Razor; -using Microsoft.VisualStudio.Text; -using Microsoft.VisualStudio.Text.Editor; -using Microsoft.VisualStudio.Utilities; - -namespace Microsoft.VisualStudio.LanguageServices.Blazor -{ - [ContentType(RazorLanguage.ContentType)] - [TextViewRole(PredefinedTextViewRoles.Editable)] - [Export(typeof(IWpfTextViewConnectionListener))] - internal class BlazorOpenDocumentTracker : IWpfTextViewConnectionListener - { - private readonly RazorEditorFactoryService _editorFactory; - private readonly Workspace _workspace; - - private readonly HashSet _openViews; - - private Type _codeGeneratorType; - private Type _projectSnapshotManagerType; - - [ImportingConstructor] - public BlazorOpenDocumentTracker( - RazorEditorFactoryService editorFactory, - [Import(typeof(VisualStudioWorkspace))] Workspace workspace) - { - if (editorFactory == null) - { - throw new ArgumentNullException(nameof(editorFactory)); - } - - if (workspace == null) - { - throw new ArgumentNullException(nameof(workspace)); - } - - _editorFactory = editorFactory; - _workspace = workspace; - - _openViews = new HashSet(); - - _workspace.WorkspaceChanged += Workspace_WorkspaceChanged; - } - - public Workspace Workspace => _workspace; - - public void SubjectBuffersConnected(IWpfTextView textView, ConnectionReason reason, Collection subjectBuffers) - { - if (textView == null) - { - throw new ArgumentException(nameof(textView)); - } - - if (subjectBuffers == null) - { - throw new ArgumentNullException(nameof(subjectBuffers)); - } - - _openViews.Add(textView); - } - - public void SubjectBuffersDisconnected(IWpfTextView textView, ConnectionReason reason, Collection subjectBuffers) - { - if (textView == null) - { - throw new ArgumentException(nameof(textView)); - } - - if (subjectBuffers == null) - { - throw new ArgumentNullException(nameof(subjectBuffers)); - } - - _openViews.Remove(textView); - } - - // We're watching the Roslyn workspace for changes specifically because we want - // to know when the language service has processed a file change. - // - // It might be more elegant to use a file watcher rather than sniffing workspace events - // but there would be a delay between the file watcher and Roslyn processing the update. - private void Workspace_WorkspaceChanged(object sender, WorkspaceChangeEventArgs e) - { - switch (e.Kind) - { - case WorkspaceChangeKind.DocumentAdded: - case WorkspaceChangeKind.DocumentChanged: - case WorkspaceChangeKind.DocumentInfoChanged: - case WorkspaceChangeKind.DocumentReloaded: - case WorkspaceChangeKind.DocumentRemoved: - - var document = e.NewSolution.GetDocument(e.DocumentId); - if (document == null || document.FilePath == null) - { - break; - } - - if (!document.FilePath.EndsWith(".g.i.cs")) - { - break; - } - - OnDeclarationsChanged(e.NewSolution.GetProject(e.ProjectId)); - break; - } - } - - private void OnDeclarationsChanged(Project project) - { - // In 15.8 the Razor Language Services provides the actual Tag Helper discovery logic. - // We can interface with that if we're running in a 15.8 build. - if (_projectSnapshotManagerType == null && _codeGeneratorType == null) - { - try - { - var assembly = typeof(Microsoft.CodeAnalysis.Razor.IProjectEngineFactory).Assembly; - _projectSnapshotManagerType = assembly.GetType("Microsoft.CodeAnalysis.Razor.ProjectSystem.ProjectSnapshotManager"); - } - catch (Exception) - { - // If the above fails, try the 15.7 logic. - } - } - - if (_projectSnapshotManagerType != null) - { - try - { - var languageServices = _workspace.Services.GetLanguageServices(RazorLanguage.Name); - var manager = languageServices - .GetType() - .GetMethod(nameof(HostLanguageServices.GetService)) - .MakeGenericMethod(_projectSnapshotManagerType) - .Invoke(languageServices, null); - - manager.GetType().GetMethod("WorkspaceProjectChanged").Invoke(manager, new object[] { project, }); - return; - } - catch (Exception) - { - // If the above fails, try the 15.7 logic. - } - } - - - // This is a design-time Razor file change.Go poke all of the open - // Razor documents and tell them to update. - var buffers = _openViews - .SelectMany(v => v.BufferGraph.GetTextBuffers(b => b.ContentType.IsOfType("RazorCSharp"))) - .Distinct() - .ToArray(); - - if (_codeGeneratorType == null) - { - try - { - var assembly = Assembly.Load("Microsoft.VisualStudio.Web.Editors.Razor.4_0, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); - _codeGeneratorType = assembly.GetType("Microsoft.VisualStudio.Web.Editors.Razor.RazorCodeGenerator"); - } - catch (Exception) - { - // If this fails, just unsubscribe. We won't be able to do our work, so just don't waste time. - _workspace.WorkspaceChanged -= Workspace_WorkspaceChanged; - } - } - - foreach (var buffer in buffers) - { - try - { - var tryGetFromBuffer = _codeGeneratorType.GetMethod("TryGetFromBuffer", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); - - var args = new object[] { buffer, null }; - if (!(bool)tryGetFromBuffer.Invoke(null, args) || args[1] == null) - { - continue; - } - - var field = _codeGeneratorType.GetField("_tagHelperDescriptorResolver", BindingFlags.Instance | BindingFlags.NonPublic); - var resolver = field.GetValue(args[1]); - if (resolver == null) - { - continue; - } - - var reset = resolver.GetType().GetMethod("ResetTagHelperDescriptors", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); - if (reset == null) - { - continue; - } - - reset.Invoke(resolver, Array.Empty()); - } - catch (Exception) - { - // If this fails, just unsubscribe. We won't be able to do our work, so just don't waste time. - _workspace.WorkspaceChanged -= Workspace_WorkspaceChanged; - } - } - } - } -} \ No newline at end of file diff --git a/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/.template.config.src/template.json b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/.template.config.src/template.json index 75a5a3bc65..9049c7d986 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/.template.config.src/template.json +++ b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/.template.config.src/template.json @@ -59,12 +59,12 @@ "datatype": "choice", "choices": [ { - "choice": "netcoreapp2.1", - "description": "Target netcoreapp2.1" + "choice": "netcoreapp3.0", + "description": "Target netcoreapp3.0" } ], - "replaces": "netcoreapp2.1", - "defaultValue": "netcoreapp2.1" + "replaces": "netcoreapp3.0", + "defaultValue": "netcoreapp3.0" }, "HostIdentifier": { "type": "bind", diff --git a/src/Components/Blazor/Templates/src/content/BlazorLibrary-CSharp/.template.config.src/template.json b/src/Components/Blazor/Templates/src/content/BlazorLibrary-CSharp/.template.config.src/template.json index aa41a4cbd7..2ac9ba33fc 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorLibrary-CSharp/.template.config.src/template.json +++ b/src/Components/Blazor/Templates/src/content/BlazorLibrary-CSharp/.template.config.src/template.json @@ -32,12 +32,12 @@ "datatype": "choice", "choices": [ { - "choice": "netcoreapp2.1", - "description": "Target netcoreapp2.1" + "choice": "netcoreapp3.0", + "description": "Target netcoreapp3.0" } ], - "replaces": "netcoreapp2.1", - "defaultValue": "netcoreapp2.1" + "replaces": "netcoreapp3.0", + "defaultValue": "netcoreapp3.0" }, "HostIdentifier": { "type": "bind", diff --git a/src/Components/Blazor/Templates/src/content/BlazorStandalone-CSharp/.template.config.src/template.json b/src/Components/Blazor/Templates/src/content/BlazorStandalone-CSharp/.template.config.src/template.json index 9deff39fd6..6bfbc79d63 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorStandalone-CSharp/.template.config.src/template.json +++ b/src/Components/Blazor/Templates/src/content/BlazorStandalone-CSharp/.template.config.src/template.json @@ -32,12 +32,12 @@ "datatype": "choice", "choices": [ { - "choice": "netcoreapp2.1", - "description": "Target netcoreapp2.1" + "choice": "netcoreapp3.0", + "description": "Target netcoreapp3.0" } ], - "replaces": "netcoreapp2.1", - "defaultValue": "netcoreapp2.1" + "replaces": "netcoreapp3.0", + "defaultValue": "netcoreapp3.0" }, "HostIdentifier": { "type": "bind", diff --git a/src/Components/Components.sln b/src/Components/Components.sln index 56a8a55546..ee94d6351b 100644 --- a/src/Components/Components.sln +++ b/src/Components/Components.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28509.92 MinimumVisualStudioVersion = 15.0.26124.0 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{E059A46B-56E3-41E2-83F4-B5D180056F3B}" EndProject @@ -15,8 +15,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor.Tests", "Blazor\Blazor\test\Microsoft.AspNetCore.Blazor.Tests.csproj", "{958AD6D2-174B-4B5B-BEFC-FA64B5159334}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.LanguageServices.Blazor", "Blazor\BlazorLanguageServices\src\Microsoft.VisualStudio.LanguageServices.Blazor.csproj", "{27CF854D-E98B-4853-946B-2D4EA28B8FC5}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor.Build", "Blazor\Build\src\Microsoft.AspNetCore.Blazor.Build.csproj", "{E8AD67A4-77D3-4B85-AE19-4711388B62B1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor.Build.Tests", "Blazor\Build\test\Microsoft.AspNetCore.Blazor.Build.Tests.csproj", "{E38FDBB0-08C1-444E-A449-69C8A59D721B}" @@ -213,6 +211,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Ne EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.JsonPatch", "..\Features\JsonPatch\src\Microsoft.AspNetCore.JsonPatch.csproj", "{DC47C40A-FC38-44E4-94A4-ADE794E76309}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.VisualStudio.BlazorExtension", "blazor\BlazorExtension\src\Microsoft.VisualStudio.BlazorExtension.csproj", "{9088E4E4-B855-457F-AE9E-D86709A5E1F4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -271,18 +271,6 @@ Global {958AD6D2-174B-4B5B-BEFC-FA64B5159334}.Release|x64.Build.0 = Release|Any CPU {958AD6D2-174B-4B5B-BEFC-FA64B5159334}.Release|x86.ActiveCfg = Release|Any CPU {958AD6D2-174B-4B5B-BEFC-FA64B5159334}.Release|x86.Build.0 = Release|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Debug|x64.ActiveCfg = Debug|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Debug|x64.Build.0 = Debug|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Debug|x86.ActiveCfg = Debug|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Debug|x86.Build.0 = Debug|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Release|Any CPU.Build.0 = Release|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Release|x64.ActiveCfg = Release|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Release|x64.Build.0 = Release|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Release|x86.ActiveCfg = Release|Any CPU - {27CF854D-E98B-4853-946B-2D4EA28B8FC5}.Release|x86.Build.0 = Release|Any CPU {E8AD67A4-77D3-4B85-AE19-4711388B62B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E8AD67A4-77D3-4B85-AE19-4711388B62B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {E8AD67A4-77D3-4B85-AE19-4711388B62B1}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1351,6 +1339,18 @@ Global {DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x64.Build.0 = Release|Any CPU {DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x86.ActiveCfg = Release|Any CPU {DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x86.Build.0 = Release|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x64.ActiveCfg = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x64.Build.0 = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x86.ActiveCfg = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x86.Build.0 = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|Any CPU.ActiveCfg = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|Any CPU.Build.0 = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x64.ActiveCfg = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x64.Build.0 = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.ActiveCfg = Debug|Any CPU + {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1360,7 +1360,6 @@ Global {F000C49D-3857-42A4-918D-DA4C08691FE2} = {E059A46B-56E3-41E2-83F4-B5D180056F3B} {641922CD-E6F5-41E7-A085-EE07C2A7328D} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} {958AD6D2-174B-4B5B-BEFC-FA64B5159334} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} - {27CF854D-E98B-4853-946B-2D4EA28B8FC5} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} {E8AD67A4-77D3-4B85-AE19-4711388B62B1} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} {E38FDBB0-08C1-444E-A449-69C8A59D721B} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} {A6C8050D-7C18-4585-ADCF-833AC1765847} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} @@ -1452,6 +1451,7 @@ Global {3FAF725B-A628-4531-9F61-499660CD4347} = {2FC10057-7A0A-4E34-8302-879925BC0102} {04262990-929C-42BF-85A9-21C25FA95617} = {2FC10057-7A0A-4E34-8302-879925BC0102} {DC47C40A-FC38-44E4-94A4-ADE794E76309} = {2FC10057-7A0A-4E34-8302-879925BC0102} + {9088E4E4-B855-457F-AE9E-D86709A5E1F4} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CC3C47E1-AD1A-4619-9CD3-E08A0148E5CE}