Skip to content

Commit f0fc598

Browse files
rynowaknatemcmaster
authored andcommitted
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
1 parent 8ce02ef commit f0fc598

File tree

15 files changed

+99
-387
lines changed

15 files changed

+99
-387
lines changed

build/repo.props

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,9 @@
3737
<!-- These projects are always excluded, even when -projects is specified on command line. -->
3838
<ItemGroup>
3939

40-
<!--
41-
Excluding the Blazor VSIX because MSBuild.exe currently always fails with "error NETSDK1050: The version of Microsoft.NET.Sdk used by this project is insufficient".
42-
This VSIX is going to move into aspnet/AspNetCore-Tooling soon
43-
-->
44-
<ProjectToExclude Include="$(RepositoryRoot)src\Components\Blazor\BlazorExtension\src\Microsoft.VisualStudio.BlazorExtension.csproj" />
45-
4640
<!-- These projects use 'legacy' csproj, which is not supported by dotnet-msbuild. -->
4741
<ProjectToExclude Include="
42+
$(RepositoryRoot)src\Components\Blazor\BlazorExtension\src\Microsoft.VisualStudio.BlazorExtension.csproj;
4843
$(RepositoryRoot)src\Servers\HttpSys\samples\TestClient\TestClient.csproj;
4944
$(RepositoryRoot)src\Middleware\WebSockets\samples\TestServer\TestServer.csproj;
5045
"

eng/ProjectReferences.props

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@
125125
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR" ProjectPath="$(RepositoryRoot)src\SignalR\server\SignalR\src\Microsoft.AspNetCore.SignalR.csproj" />
126126
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Specification.Tests" ProjectPath="$(RepositoryRoot)src\SignalR\server\Specification.Tests\src\Microsoft.AspNetCore.SignalR.Specification.Tests.csproj" />
127127
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" ProjectPath="$(RepositoryRoot)src\SignalR\server\StackExchangeRedis\src\Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj" />
128-
<ProjectReferenceProvider Include="Microsoft.VisualStudio.LanguageServices.Blazor" ProjectPath="$(RepositoryRoot)src\Components\Blazor\BlazorLanguageServices\src\Microsoft.VisualStudio.LanguageServices.Blazor.csproj" />
129128
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor" ProjectPath="$(RepositoryRoot)src\Components\Blazor\Blazor\src\Microsoft.AspNetCore.Blazor.csproj" />
130129
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor.Build" ProjectPath="$(RepositoryRoot)src\Components\Blazor\Build\src\Microsoft.AspNetCore.Blazor.Build.csproj" />
131130
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor.Server" ProjectPath="$(RepositoryRoot)src\Components\Blazor\Server\src\Microsoft.AspNetCore.Blazor.Server.csproj" />

src/Components/Blazor/BlazorExtension/src/AutoRebuild/AutoRebuildService.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) .NET Foundation. All rights reserved.
1+
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using Microsoft.VisualStudio.Shell.Interop;
@@ -33,12 +33,12 @@ public AutoRebuildService(BuildEventsWatcher buildEventsWatcher)
3333

3434
public void Listen()
3535
{
36-
AddBuildServiceNamedPipeServer();
36+
_ = AddBuildServiceNamedPipeServerAsync();
3737
}
3838

39-
private void AddBuildServiceNamedPipeServer()
39+
private Task AddBuildServiceNamedPipeServerAsync()
4040
{
41-
Task.Factory.StartNew(async () =>
41+
return Task.Factory.StartNew(async () =>
4242
{
4343
try
4444
{
@@ -69,7 +69,7 @@ private void AddBuildServiceNamedPipeServer()
6969
// As soon as we receive a connection, spin up another background
7070
// listener to wait for the next connection
7171
await serverPipe.WaitForConnectionAsync();
72-
AddBuildServiceNamedPipeServer();
72+
_ = AddBuildServiceNamedPipeServerAsync();
7373

7474
await HandleRequestAsync(serverPipe, isServerElevated);
7575
}

src/Components/Blazor/BlazorExtension/src/AutoRebuild/BuildEventsWatcher.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
// Copyright (c) .NET Foundation. All rights reserved.
1+
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
55
using System.Collections.Generic;
66
using System.Threading.Tasks;
7-
using Microsoft.VisualStudio.ProjectSystem.Properties;
87
using Microsoft.VisualStudio.Shell;
98
using Microsoft.VisualStudio.Shell.Interop;
109

@@ -74,14 +73,16 @@ public int OnActiveProjectCfgChange(IVsHierarchy pIVsHierarchy)
7473

7574
public int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, ref int pfCancel)
7675
{
76+
ThreadHelper.ThrowIfNotOnUIThread();
77+
7778
if (IsBlazorProject(pHierProj))
7879
{
7980
// This method runs both for manually-invoked builds and for builds triggered automatically
8081
// by PerformNewBuildAsync(). In the case where it's a manually-invoked build, make sure
8182
// there's an in-progress BuildInfo so that if there are further builds requests while the
8283
// build is still in progress we can join them onto this existing build.
83-
var ctx = (IVsBrowseObjectContext)pCfgProj;
84-
var projectPath = ctx.UnconfiguredProject.FullPath;
84+
85+
var projectPath = GetProjectPath(pHierProj);
8586
lock (mostRecentBuildInfosLock)
8687
{
8788
var hasBuildInProgress =
@@ -99,11 +100,12 @@ public int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCf
99100

100101
public int UpdateProjectCfg_Done(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, int fSuccess, int fCancel)
101102
{
103+
ThreadHelper.ThrowIfNotOnUIThread();
104+
102105
if (IsBlazorProject(pHierProj))
103106
{
104107
var buildResult = fSuccess == 1;
105-
var ctx = (IVsBrowseObjectContext)pCfgProj;
106-
var projectPath = ctx.UnconfiguredProject.FullPath;
108+
var projectPath = GetProjectPath(pHierProj);
107109

108110
// Mark pending build info as completed
109111
BuildInfo foundInfo = null;
@@ -160,6 +162,13 @@ private async Task<bool> PerformNewBuildAsync(string projectPath, BuildInfo buil
160162
private static bool IsBlazorProject(IVsHierarchy pHierProj)
161163
=> pHierProj.IsCapabilityMatch(BlazorProjectCapability);
162164

165+
private static string GetProjectPath(IVsHierarchy pHierProj)
166+
{
167+
ThreadHelper.ThrowIfNotOnUIThread();
168+
ErrorHandler.ThrowOnFailure(((IVsProject)pHierProj).GetMkDocument((uint)VSConstants.VSITEMID.Root, out var projectPath), VSConstants.E_NOTIMPL);
169+
return projectPath;
170+
}
171+
163172
class BuildInfo
164173
{
165174
public DateTime StartTime { get; }
Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,44 @@
1-
// Copyright (c) .NET Foundation. All rights reserved.
1+
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
55
using System.Runtime.InteropServices;
6+
using System.Threading;
7+
using System.Threading.Tasks;
68
using Microsoft.VisualStudio.Shell;
79
using Microsoft.VisualStudio.Shell.Interop;
10+
using Task = System.Threading.Tasks.Task;
811

912
namespace Microsoft.VisualStudio.BlazorExtension
1013
{
1114
// We mainly have a package so we can have an "About" dialog entry.
12-
[PackageRegistration(UseManagedResourcesOnly = true)]
15+
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
1316
[AboutDialogInfo(PackageGuidString, "ASP.NET Core Blazor Language Services", "#110", "112")]
1417
[Guid(BlazorPackage.PackageGuidString)]
15-
[ProvideAutoLoad(UIContextGuids80.SolutionExists)]
16-
public sealed class BlazorPackage : Package
18+
[ProvideAutoLoad(UIContextGuids80.SolutionExists, PackageAutoLoadFlags.BackgroundLoad)]
19+
public sealed class BlazorPackage : AsyncPackage
1720
{
1821
public const string PackageGuidString = "d9fe04bc-57a7-4107-915e-3a5c2f9e19fb";
1922

20-
protected override void Initialize()
23+
protected async override Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
2124
{
22-
base.Initialize();
23-
RegisterAutoRebuildService();
24-
}
25+
await base.InitializeAsync(cancellationToken, progress);
2526

26-
private void RegisterAutoRebuildService()
27-
{
28-
ThreadHelper.ThrowIfNotOnUIThread();
27+
await JoinableTaskFactory.SwitchToMainThreadAsync();
2928

3029
// Create build watcher. No need to unadvise, as this only happens once anyway.
31-
var solution = (IVsSolution)GetGlobalService(typeof(IVsSolution));
32-
var buildManager = (IVsSolutionBuildManager)GetService(typeof(SVsSolutionBuildManager));
33-
var buildWatcher = new BuildEventsWatcher(solution, buildManager);
34-
var hr = buildManager.AdviseUpdateSolutionEvents(buildWatcher, out var cookie);
35-
Marshal.ThrowExceptionForHR(hr);
30+
var solution = (IVsSolution)await GetServiceAsync(typeof(IVsSolution));
31+
var buildManager = (IVsSolutionBuildManager)await GetServiceAsync(typeof(SVsSolutionBuildManager));
32+
33+
// According to the docs, this can happen if VS shuts down while our package is loading.
34+
if (solution == null || buildManager == null)
35+
{
36+
var buildWatcher = new BuildEventsWatcher(solution, buildManager);
37+
var hr = buildManager.AdviseUpdateSolutionEvents(buildWatcher, out var cookie);
38+
Marshal.ThrowExceptionForHR(hr);
3639

37-
new AutoRebuildService(buildWatcher).Listen();
40+
new AutoRebuildService(buildWatcher).Listen();
41+
}
3842
}
3943
}
4044
}

src/Components/Blazor/BlazorExtension/src/Microsoft.VisualStudio.BlazorExtension.csproj

Lines changed: 23 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@
88
<ImportDirectoryBuildTargets>true</ImportDirectoryBuildTargets>
99
<OutputPath>bin\$(Configuration)\</OutputPath>
1010
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
11-
<!-- Other projects should not reference this assembly. It is only mean to be used in Visual Studio. -->
11+
<!-- Other projects should not reference this assembly. It is only meaning to be used in Visual Studio. -->
1212
<IsProjectReferenceProvider>false</IsProjectReferenceProvider>
13+
<IsShippingPackage>false</IsShippingPackage>
14+
<IsPackable>false</IsPackable>
15+
<EnableSourceLink>false</EnableSourceLink>
16+
<GenerateSourceLinkFile>false</GenerateSourceLinkFile>
1317
</PropertyGroup>
1418
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
19+
1520
<!--
1621
Since the VSSDK doeesn't support SDK-based projects, we have to use the long/verbose version.
1722
@@ -20,26 +25,23 @@
2025
2126
BEGIN INTERESTING STUFF
2227
-->
23-
<PropertyGroup>
24-
<!-- VSIXes are always signed. This is the same key that ASP.NET uses for OSS signing -->
25-
<SignAssembly>true</SignAssembly>
26-
<AssemblyOriginatorKeyFile>..\..\..\eng\AspNetCore.snk</AssemblyOriginatorKeyFile>
27-
</PropertyGroup>
2828
<PropertyGroup>
2929
<!--
3030
Following VS convention of using the VS release # as a convention for the vsix version.
3131
32-
VS needs this build number to be parsable by System.Version, so it can't have any letters.
32+
VS needs this build number to be parsable by System.Version, so it can't have any letters or a - which
33+
is used by our build system.
3334
-->
34-
<VsixVersion>15.7</VsixVersion>
35-
<VsixVersion Condition="'$(BuildNumber)'!='' AND '$(BuildNumber)'!='t000'">$(VsixVersion).$(BuildNumber)</VsixVersion>
36-
<VsixVersion Condition="'$(BuildNumber)'=='' AND '$(CI)'!='true'">$(VsixVersion).999999</VsixVersion>
37-
<VsixVersion Condition="'$(BuildNumber)'=='' AND '$(CI)'=='true'">$(VsixVersion).ERROR-MISSING_BUILD_NUMBER</VsixVersion>
35+
<VsixVersionPrefix>16.0</VsixVersionPrefix>
36+
<VsixVersionSuffix Condition="'$(BuildNumberSuffix)'=='t000'">424242.424242</VsixVersionSuffix>
37+
<VsixVersionSuffix Condition="'$(VsixVersionSuffix)'==''">$(BuildNumberSuffix.Replace('-', '.'))</VsixVersionSuffix>
38+
<VsixVersion>$(VsixVersionPrefix).$(VsixVersionSuffix)</VsixVersion>
3839
</PropertyGroup>
3940
<!--
4041
Used by the .vsixmanifest to insert the the VSIX version based on $(VsixVersion)
4142
-->
4243
<Target Name="GetBuildVersion" Outputs="$(VsixVersion)" />
44+
4345
<PropertyGroup>
4446
<!-- Use the same experimental hive as Roslyn and Razor. This makes it easy to mix private builds. -->
4547
<StartAction>Program</StartAction>
@@ -71,7 +73,7 @@
7173
<CopyBuildOutputToOutputDirectory>true</CopyBuildOutputToOutputDirectory>
7274
<CopyOutputSymbolsToOutputDirectory>true</CopyOutputSymbolsToOutputDirectory>
7375
</PropertyGroup>
74-
<Target Name="PreCreateVsixContainer" BeforeTargets="CreateVsixContainer">
76+
<Target Name="PreCreateVsixContainer" BeforeTargets="GetVsixSourceItems">
7577
<ItemGroup>
7678
<VSIXSourceItem Include="$(ArtifactsShippingPackagesDir)Microsoft.AspNetCore.Blazor.Templates.*.nupkg">
7779
<VSIXSubPath>ProjectTemplates\</VSIXSubPath>
@@ -89,25 +91,7 @@
8991
<Target Name="CopySymbolsToOutput" AfterTargets="Build" Condition="'$(SymbolsPublishDir)' != ''">
9092
<Copy SourceFiles="$(OutDir)$(AssemblyName).pdb" DestinationFolder="$(SymbolsPublishDir)" />
9193
</Target>
92-
<!--
93-
We should be really careful about what goes into the VSIX and what doesn't. Since we're using
94-
P2P references and packages, there are some things we need to exclude.
9594

96-
We want everything that *we* don't own to be excluded, those dependencies need to be satisfied
97-
by other VS components (Razor, Roslyn).
98-
99-
Ideally we could use an allow-list here, but I don't know how to do that.
100-
-->
101-
<ItemDefinitionGroup>
102-
<SuppressFromVsix>
103-
<Visible>false</Visible>
104-
</SuppressFromVsix>
105-
</ItemDefinitionGroup>
106-
<ItemGroup>
107-
<SuppressFromVsix Include="Microsoft.AspNetCore.Razor.Language.dll" />
108-
<SuppressFromVsix Include="Microsoft.CodeAnalysis.Razor.dll" />
109-
<SuppressFromVsix Include="Microsoft.CodeAnalysis.Razor.Workspaces.dll" />
110-
</ItemGroup>
11195
<ItemGroup>
11296
<!--
11397
Let's continue our parade of gross workarounds.
@@ -124,27 +108,13 @@
124108
<ProjectReference Include="..\..\Templates\src\Microsoft.AspNetCore.Blazor.Templates.csproj">
125109
<Project>{edd21533-c6e6-4f85-be4f-10e06756e24c}</Project>
126110
<Name>Microsoft.AspNetCore.Blazor.Templates</Name>
111+
<Targets>Pack</Targets>
127112
<Private>False</Private>
128113
<IncludeOutputGroupsInVSIX>
129114
</IncludeOutputGroupsInVSIX>
130115
<IncludeOutputGroupsInVSIXLocalOnly>
131116
</IncludeOutputGroupsInVSIXLocalOnly>
132117
</ProjectReference>
133-
<ProjectReference Include="..\..\BlazorLanguageServices\src\Microsoft.VisualStudio.LanguageServices.Blazor.csproj">
134-
<Project>{b9f7f502-6dd2-4e77-8fd1-cbd76f695b26}</Project>
135-
<Name>Microsoft.VisualStudio.LanguageServices.Blazor</Name>
136-
<Private>False</Private>
137-
<IncludeOutputGroupsInVSIX>
138-
</IncludeOutputGroupsInVSIX>
139-
<IncludeOutputGroupsInVSIXLocalOnly>
140-
</IncludeOutputGroupsInVSIXLocalOnly>
141-
</ProjectReference>
142-
<Content Include="..\..\BlazorLanguageServices\src\bin\$(Configuration)\net461\Microsoft.VisualStudio.LanguageServices.Blazor.dll">
143-
<Link>Microsoft.VisualStudio.LanguageServices.Blazor.dll</Link>
144-
<IncludeInVSIX>true</IncludeInVSIX>
145-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
146-
<Visible>false</Visible>
147-
</Content>
148118
</ItemGroup>
149119
<!--
150120
We need to generate the assembly attributes for our assembly using the version from the build, so
@@ -189,7 +159,7 @@
189159
<AppDesignerFolder>Properties</AppDesignerFolder>
190160
<RootNamespace>Microsoft.VisualStudio.BlazorExtension</RootNamespace>
191161
<AssemblyName>Microsoft.VisualStudio.BlazorExtension</AssemblyName>
192-
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
162+
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
193163
<GeneratePkgDefFile>true</GeneratePkgDefFile>
194164
</PropertyGroup>
195165
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -208,33 +178,16 @@
208178
<WarningLevel>4</WarningLevel>
209179
</PropertyGroup>
210180
<ItemGroup>
211-
<PackageReference Include="Microsoft.VisualStudio.CoreUtility" Version="15.6.27413" />
212-
<PackageReference Include="Microsoft.VisualStudio.Imaging" Version="15.6.27413" />
213-
<PackageReference Include="Microsoft.VisualStudio.OLE.Interop" Version="7.10.6071" />
214-
<PackageReference Include="Microsoft.VisualStudio.ProjectSystem" Version="15.3.224" />
215-
<PackageReference Include="Microsoft.VisualStudio.SDK.EmbedInteropTypes" Version="15.0.16" />
216-
<PackageReference Include="Microsoft.VisualStudio.Shell.15.0" Version="15.6.27413" />
217-
<PackageReference Include="Microsoft.VisualStudio.Shell.Framework" Version="15.6.27413" />
218-
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop" Version="7.10.6072" />
219-
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop.10.0" Version="10.0.30320" />
220-
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop.11.0" Version="11.0.61031" />
221-
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop.12.0" Version="12.0.30110" />
222-
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop.8.0" Version="8.0.50728" />
223-
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop.9.0" Version="9.0.30730" />
224-
<PackageReference Include="Microsoft.VisualStudio.TextManager.Interop" Version="7.10.6071" />
225-
<PackageReference Include="Microsoft.VisualStudio.TextManager.Interop.8.0" Version="8.0.50728" />
226-
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="15.6.46" />
227-
<PackageReference Include="Microsoft.VisualStudio.Utilities" Version="15.6.27413" />
228-
<PackageReference Include="Microsoft.VisualStudio.Validation" Version="15.3.15" />
229-
<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="15.5.100" />
181+
<PackageReference Include="Microsoft.VisualStudio.Shell.15.0" Version="15.7.27703" />
182+
<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="15.9.3032" />
183+
<PackageReference Include="StreamJsonRpc" Version="1.5.43" />
230184
</ItemGroup>
231185
<ItemGroup>
232186
<Compile Include="AboutDialogInfoAttribute.cs" />
233187
<Compile Include="AutoRebuild\AutoRebuildService.cs" />
234188
<Compile Include="AutoRebuild\BuildEventsWatcher.cs" />
235189
<Compile Include="AutoRebuild\StreamProtocolExtensions.cs" />
236190
<Compile Include="BlazorPackage.cs" />
237-
<Compile Include="Properties\AssemblyInfo.cs" />
238191
</ItemGroup>
239192
<ItemGroup>
240193
<Content Include="CodeSnippets\Blazor\para.snippet">
@@ -306,4 +259,8 @@
306259
<_GeneratedVSIXAssemblyInfoInputsCacheFile>$(IntermediateOutputPath)$(MSBuildProjectName).VSIXAssemblyInfo.cache.txt</_GeneratedVSIXAssemblyInfoInputsCacheFile>
307260
<_GeneratedVSIXAssemblyInfoFile>$(IntermediateOutputPath)$(MSBuildProjectName).VSIXAssemblyInfo.cs</_GeneratedVSIXAssemblyInfoFile>
308261
</PropertyGroup>
262+
263+
<!-- This needs to be here because the build will try to call it -->
264+
<Target Name="Pack">
265+
</Target>
309266
</Project>

src/Components/Blazor/BlazorExtension/src/Properties/AssemblyInfo.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
[$RootKey$\TemplateEngine\Templates\Blazor\0.2.0]
1+
[$RootKey$\TemplateEngine\Templates\Blazor\0.8.0]
22
"InstalledPath"="$PackageFolder$\ProjectTemplates"

0 commit comments

Comments
 (0)