Remove Blazor VSIX
This is no longer shipped, because the templates installed by `dotnet new -i` show up in VS now. Removing it now so we don't have to keep it around in servicing forever.
This commit is contained in:
parent
a4ab9ffa05
commit
29cf7ecb80
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
<!-- These projects use 'legacy' csproj, which is not supported by dotnet-msbuild. -->
|
<!-- These projects use 'legacy' csproj, which is not supported by dotnet-msbuild. -->
|
||||||
<ProjectToExclude Include="
|
<ProjectToExclude Include="
|
||||||
$(RepoRoot)src\Components\Blazor\BlazorExtension\src\Microsoft.VisualStudio.BlazorExtension.csproj;
|
|
||||||
$(RepoRoot)src\Servers\HttpSys\samples\TestClient\TestClient.csproj;
|
$(RepoRoot)src\Servers\HttpSys\samples\TestClient\TestClient.csproj;
|
||||||
$(RepoRoot)src\Middleware\WebSockets\samples\TestServer\WebSockets.TestServer.csproj;
|
$(RepoRoot)src\Middleware\WebSockets\samples\TestServer\WebSockets.TestServer.csproj;
|
||||||
"
|
"
|
||||||
|
|
|
||||||
|
|
@ -1,56 +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.Diagnostics;
|
|
||||||
using System.Reflection;
|
|
||||||
using Microsoft.VisualStudio.Shell;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
public class AboutDialogInfoAttribute : RegistrationAttribute
|
|
||||||
{
|
|
||||||
private readonly string _detailsId;
|
|
||||||
private readonly string _name;
|
|
||||||
private readonly string _nameId;
|
|
||||||
private readonly string _packageGuid;
|
|
||||||
|
|
||||||
// nameId and detailsId are resource IDs, they should start with #
|
|
||||||
public AboutDialogInfoAttribute(string packageGuid, string name, string nameId, string detailsId)
|
|
||||||
{
|
|
||||||
_packageGuid = packageGuid;
|
|
||||||
_name = name;
|
|
||||||
_nameId = nameId;
|
|
||||||
_detailsId = detailsId;
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetKeyName()
|
|
||||||
{
|
|
||||||
return "InstalledProducts\\" + _name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Register(RegistrationContext context)
|
|
||||||
{
|
|
||||||
var version = typeof(AboutDialogInfoAttribute).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
|
|
||||||
|
|
||||||
using (var key = context.CreateKey(GetKeyName()))
|
|
||||||
{
|
|
||||||
key.SetValue(null, _nameId);
|
|
||||||
key.SetValue("Package", Guid.Parse(_packageGuid).ToString("B"));
|
|
||||||
key.SetValue("ProductDetails", _detailsId);
|
|
||||||
key.SetValue("UseInterface", false);
|
|
||||||
key.SetValue("UseVSProductID", false);
|
|
||||||
|
|
||||||
if (version != null)
|
|
||||||
{
|
|
||||||
key.SetValue("PID", version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Unregister(RegistrationContext context)
|
|
||||||
{
|
|
||||||
context.RemoveKey(GetKeyName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,147 +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.Interop;
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.IO.Pipes;
|
|
||||||
using System.Security.AccessControl;
|
|
||||||
using System.Security.Principal;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Package = Microsoft.VisualStudio.Shell.Package;
|
|
||||||
using ThreadHelper = Microsoft.VisualStudio.Shell.ThreadHelper;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The counterpart to VSForWindowsRebuildService.cs in the Blazor.Server project.
|
|
||||||
/// Listens for named pipe connections and rebuilds projects on request.
|
|
||||||
/// </summary>
|
|
||||||
internal class AutoRebuildService
|
|
||||||
{
|
|
||||||
private const int _protocolVersion = 1;
|
|
||||||
private readonly BuildEventsWatcher _buildEventsWatcher;
|
|
||||||
private readonly string _pipeName;
|
|
||||||
|
|
||||||
public AutoRebuildService(BuildEventsWatcher buildEventsWatcher)
|
|
||||||
{
|
|
||||||
_buildEventsWatcher = buildEventsWatcher ?? throw new ArgumentNullException(nameof(buildEventsWatcher));
|
|
||||||
_pipeName = $"BlazorAutoRebuild\\{Process.GetCurrentProcess().Id}";
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Listen()
|
|
||||||
{
|
|
||||||
_ = AddBuildServiceNamedPipeServerAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task AddBuildServiceNamedPipeServerAsync()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew(async () =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var identity = WindowsIdentity.GetCurrent();
|
|
||||||
var identifier = identity.Owner;
|
|
||||||
var security = new PipeSecurity();
|
|
||||||
|
|
||||||
// Restrict access to just this account.
|
|
||||||
var rule = new PipeAccessRule(identifier, PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow);
|
|
||||||
security.AddAccessRule(rule);
|
|
||||||
security.SetOwner(identifier);
|
|
||||||
|
|
||||||
// And our current elevation level
|
|
||||||
var principal = new WindowsPrincipal(identity);
|
|
||||||
var isServerElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
|
|
||||||
|
|
||||||
using (var serverPipe = new NamedPipeServerStream(
|
|
||||||
_pipeName,
|
|
||||||
PipeDirection.InOut,
|
|
||||||
NamedPipeServerStream.MaxAllowedServerInstances,
|
|
||||||
PipeTransmissionMode.Byte,
|
|
||||||
PipeOptions.Asynchronous | PipeOptions.WriteThrough,
|
|
||||||
0x10000, // 64k input buffer
|
|
||||||
0x10000, // 64k output buffer
|
|
||||||
security,
|
|
||||||
HandleInheritability.None))
|
|
||||||
{
|
|
||||||
// As soon as we receive a connection, spin up another background
|
|
||||||
// listener to wait for the next connection
|
|
||||||
await serverPipe.WaitForConnectionAsync();
|
|
||||||
_ = AddBuildServiceNamedPipeServerAsync();
|
|
||||||
|
|
||||||
await HandleRequestAsync(serverPipe, isServerElevated);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
await AttemptLogErrorAsync(
|
|
||||||
$"Error in Blazor AutoRebuildService:\n{ex.Message}\n{ex.StackTrace}");
|
|
||||||
}
|
|
||||||
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task HandleRequestAsync(NamedPipeServerStream stream, bool isServerElevated)
|
|
||||||
{
|
|
||||||
// Protocol:
|
|
||||||
// 1. Send a "protocol version" number to the client
|
|
||||||
// 2. Receive the project path from the client
|
|
||||||
// If it is the special string "abort", gracefully disconnect and end
|
|
||||||
// This is to allow for mismatches between server and client protocol version
|
|
||||||
// 3. Receive the "if not built since" timestamp from the client
|
|
||||||
// 4. Perform the build, then send back the success/failure result flag
|
|
||||||
// Keep in sync with VSForWindowsRebuildService.cs in the Blazor.Server project
|
|
||||||
// In the future we may extend this to getting back build error details
|
|
||||||
await stream.WriteIntAsync(_protocolVersion);
|
|
||||||
var projectPath = await stream.ReadStringAsync();
|
|
||||||
|
|
||||||
// We can't do the security check for elevation until we read from the stream.
|
|
||||||
if (isServerElevated != IsClientElevated(stream))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (projectPath.Equals("abort", StringComparison.Ordinal))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var allowExistingBuildsSince = await stream.ReadDateTimeAsync();
|
|
||||||
var buildResult = await _buildEventsWatcher.PerformBuildAsync(projectPath, allowExistingBuildsSince);
|
|
||||||
await stream.WriteBoolAsync(buildResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task AttemptLogErrorAsync(string message)
|
|
||||||
{
|
|
||||||
if (!ThreadHelper.CheckAccess())
|
|
||||||
{
|
|
||||||
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
var outputWindow = (IVsOutputWindow)Package.GetGlobalService(typeof(SVsOutputWindow));
|
|
||||||
if (outputWindow != null)
|
|
||||||
{
|
|
||||||
outputWindow.GetPane(VSConstants.OutputWindowPaneGuid.BuildOutputPane_guid, out var pane);
|
|
||||||
if (pane != null)
|
|
||||||
{
|
|
||||||
pane.OutputString(message);
|
|
||||||
pane.Activate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool? IsClientElevated(NamedPipeServerStream stream)
|
|
||||||
{
|
|
||||||
bool? isClientElevated = null;
|
|
||||||
stream.RunAsClient(() =>
|
|
||||||
{
|
|
||||||
var identity = WindowsIdentity.GetCurrent(ifImpersonating: true);
|
|
||||||
var principal = new WindowsPrincipal(identity);
|
|
||||||
isClientElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
|
|
||||||
});
|
|
||||||
|
|
||||||
return isClientElevated;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,184 +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.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.Shell;
|
|
||||||
using Microsoft.VisualStudio.Shell.Interop;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Watches for Blazor project build events, starts new builds, and tracks builds in progress.
|
|
||||||
/// </summary>
|
|
||||||
internal class BuildEventsWatcher : IVsUpdateSolutionEvents2
|
|
||||||
{
|
|
||||||
private const string BlazorProjectCapability = "Blazor";
|
|
||||||
private readonly IVsSolution _vsSolution;
|
|
||||||
private readonly IVsSolutionBuildManager _vsBuildManager;
|
|
||||||
private readonly object mostRecentBuildInfosLock = new object();
|
|
||||||
private readonly Dictionary<string, BuildInfo> mostRecentBuildInfos
|
|
||||||
= new Dictionary<string, BuildInfo>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
public BuildEventsWatcher(IVsSolution vsSolution, IVsSolutionBuildManager vsBuildManager)
|
|
||||||
{
|
|
||||||
_vsSolution = vsSolution ?? throw new ArgumentNullException(nameof(vsSolution));
|
|
||||||
_vsBuildManager = vsBuildManager ?? throw new ArgumentNullException(nameof(vsBuildManager));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> PerformBuildAsync(string projectPath, DateTime allowExistingBuildsSince)
|
|
||||||
{
|
|
||||||
BuildInfo newBuildInfo;
|
|
||||||
|
|
||||||
lock (mostRecentBuildInfosLock)
|
|
||||||
{
|
|
||||||
if (mostRecentBuildInfos.TryGetValue(projectPath, out var existingInfo))
|
|
||||||
{
|
|
||||||
// If there's a build in progress, we'll join that even if it was started
|
|
||||||
// before allowExistingBuildsSince, because it's too messy to cancel
|
|
||||||
// in-progress builds. On rare occasions if the user is editing files while
|
|
||||||
// a build is in progress they *might* see a not-latest build when they
|
|
||||||
// reload, but then they just have to reload again.
|
|
||||||
var acceptBuild = !existingInfo.TaskCompletionSource.Task.IsCompleted
|
|
||||||
|| existingInfo.StartTime > allowExistingBuildsSince;
|
|
||||||
if (acceptBuild)
|
|
||||||
{
|
|
||||||
return existingInfo.TaskCompletionSource.Task;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We're going to start a new build now. Track the BuildInfo for it even
|
|
||||||
// before it starts so other incoming build requests can join it.
|
|
||||||
mostRecentBuildInfos[projectPath] = newBuildInfo = new BuildInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
return PerformNewBuildAsync(projectPath, newBuildInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int UpdateSolution_Begin(ref int pfCancelUpdate)
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int UpdateSolution_Done(int fSucceeded, int fModified, int fCancelCommand)
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int UpdateSolution_StartUpdate(ref int pfCancelUpdate)
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int UpdateSolution_Cancel()
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int OnActiveProjectCfgChange(IVsHierarchy pIVsHierarchy)
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
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 projectPath = GetProjectPath(pHierProj);
|
|
||||||
lock (mostRecentBuildInfosLock)
|
|
||||||
{
|
|
||||||
var hasBuildInProgress =
|
|
||||||
mostRecentBuildInfos.TryGetValue(projectPath, out var existingInfo)
|
|
||||||
&& !existingInfo.TaskCompletionSource.Task.IsCompleted;
|
|
||||||
if (!hasBuildInProgress)
|
|
||||||
{
|
|
||||||
mostRecentBuildInfos[projectPath] = new BuildInfo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return VSConstants.S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
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 projectPath = GetProjectPath(pHierProj);
|
|
||||||
|
|
||||||
// Mark pending build info as completed
|
|
||||||
BuildInfo foundInfo = null;
|
|
||||||
lock (mostRecentBuildInfosLock)
|
|
||||||
{
|
|
||||||
mostRecentBuildInfos.TryGetValue(projectPath, out foundInfo);
|
|
||||||
}
|
|
||||||
if (foundInfo != null)
|
|
||||||
{
|
|
||||||
foundInfo.TaskCompletionSource.TrySetResult(buildResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return VSConstants.S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<bool> PerformNewBuildAsync(string projectPath, BuildInfo buildInfo)
|
|
||||||
{
|
|
||||||
// Switch to the UI thread and request the build
|
|
||||||
var didStartBuild = await ThreadHelper.JoinableTaskFactory.RunAsync(async delegate
|
|
||||||
{
|
|
||||||
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
|
|
||||||
|
|
||||||
var hr = _vsSolution.GetProjectOfUniqueName(projectPath, out var hierarchy);
|
|
||||||
if (hr != VSConstants.S_OK)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = _vsBuildManager.StartSimpleUpdateProjectConfiguration(
|
|
||||||
hierarchy,
|
|
||||||
/* not used */ null,
|
|
||||||
/* not used */ null,
|
|
||||||
(uint)VSSOLNBUILDUPDATEFLAGS.SBF_OPERATION_BUILD,
|
|
||||||
/* other flags */ 0,
|
|
||||||
/* suppress dialogs */ 1);
|
|
||||||
if (hr != VSConstants.S_OK)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!didStartBuild)
|
|
||||||
{
|
|
||||||
// Since the build didn't start, make sure nobody's waiting for it
|
|
||||||
buildInfo.TaskCompletionSource.TrySetResult(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return await buildInfo.TaskCompletionSource.Task;
|
|
||||||
}
|
|
||||||
|
|
||||||
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; }
|
|
||||||
public TaskCompletionSource<bool> TaskCompletionSource { get; }
|
|
||||||
|
|
||||||
public BuildInfo()
|
|
||||||
{
|
|
||||||
StartTime = DateTime.Now;
|
|
||||||
TaskCompletionSource = new TaskCompletionSource<bool>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,49 +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.IO;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
internal static class StreamProtocolExtensions
|
|
||||||
{
|
|
||||||
public static async Task<string> ReadStringAsync(this Stream stream)
|
|
||||||
{
|
|
||||||
var length = BitConverter.ToInt32(await ReadBytesAsync(stream, 4), 0);
|
|
||||||
var utf8Bytes = await ReadBytesAsync(stream, length);
|
|
||||||
return Encoding.UTF8.GetString(utf8Bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<DateTime> ReadDateTimeAsync(this Stream stream)
|
|
||||||
{
|
|
||||||
var ticksBytes = await ReadBytesAsync(stream, 8);
|
|
||||||
var ticks = BitConverter.ToInt64(ticksBytes, 0);
|
|
||||||
return new DateTime(ticks);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task WriteBoolAsync(this Stream stream, bool value)
|
|
||||||
{
|
|
||||||
var byteVal = value ? (byte)1 : (byte)0;
|
|
||||||
await stream.WriteAsync(new[] { byteVal }, 0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task WriteIntAsync(this Stream stream, int value)
|
|
||||||
{
|
|
||||||
await stream.WriteAsync(BitConverter.GetBytes(value), 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static async Task<byte[]> ReadBytesAsync(Stream stream, int exactLength)
|
|
||||||
{
|
|
||||||
var buf = new byte[exactLength];
|
|
||||||
var bytesRead = 0;
|
|
||||||
while (bytesRead < exactLength)
|
|
||||||
{
|
|
||||||
bytesRead += await stream.ReadAsync(buf, bytesRead, exactLength - bytesRead);
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +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.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, AllowsBackgroundLoading = true)]
|
|
||||||
[AboutDialogInfo(PackageGuidString, "ASP.NET Core Blazor Language Services", "#110", "112")]
|
|
||||||
[Guid(BlazorPackage.PackageGuidString)]
|
|
||||||
[ProvideAutoLoad(UIContextGuids80.SolutionExists, PackageAutoLoadFlags.BackgroundLoad)]
|
|
||||||
public sealed class BlazorPackage : AsyncPackage
|
|
||||||
{
|
|
||||||
public const string PackageGuidString = "d9fe04bc-57a7-4107-915e-3a5c2f9e19fb";
|
|
||||||
|
|
||||||
protected async override Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
|
|
||||||
{
|
|
||||||
await base.InitializeAsync(cancellationToken, progress);
|
|
||||||
|
|
||||||
await JoinableTaskFactory.SwitchToMainThreadAsync();
|
|
||||||
|
|
||||||
// Create build watcher. No need to unadvise, as this only happens once anyway.
|
|
||||||
var solution = (IVsSolution)await GetServiceAsync(typeof(IVsSolution));
|
|
||||||
var buildManager = (IVsSolutionBuildManager)await GetServiceAsync(typeof(SVsSolutionBuildManager));
|
|
||||||
|
|
||||||
// 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
[$RootKey$\Languages\CodeExpansions\CSharp\Paths]
|
|
||||||
"Blazor"="$PackageFolder$\CodeSnippets\Blazor"
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
|
|
||||||
<CodeSnippet Format="1.0.0">
|
|
||||||
<Header>
|
|
||||||
<Title>para</Title>
|
|
||||||
<Shortcut>para</Shortcut>
|
|
||||||
<Description>Code snippet for an automatically implemented parameter for Blazor</Description>
|
|
||||||
<Author>Microsoft</Author>
|
|
||||||
<SnippetTypes>
|
|
||||||
<SnippetType>Expansion</SnippetType>
|
|
||||||
</SnippetTypes>
|
|
||||||
</Header>
|
|
||||||
<Snippet>
|
|
||||||
<Declarations>
|
|
||||||
<Literal>
|
|
||||||
<ID>type</ID>
|
|
||||||
<ToolTip>Parameter type</ToolTip>
|
|
||||||
<Default>int</Default>
|
|
||||||
</Literal>
|
|
||||||
<Literal>
|
|
||||||
<ID>property</ID>
|
|
||||||
<ToolTip>Parameter name</ToolTip>
|
|
||||||
<Default>MyParameter</Default>
|
|
||||||
</Literal>
|
|
||||||
</Declarations>
|
|
||||||
<Code Language="csharp">
|
|
||||||
<![CDATA[[Parameter] protected $type$ $property$ { get; set; }$end$]]>
|
|
||||||
</Code>
|
|
||||||
</Snippet>
|
|
||||||
</CodeSnippet>
|
|
||||||
</CodeSnippets>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.9 KiB |
|
|
@ -1,148 +0,0 @@
|
||||||
<Project>
|
|
||||||
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net472</TargetFramework>
|
|
||||||
|
|
||||||
<!-- Use the same experimental hive as Roslyn and Razor. This makes it easy to mix private builds. -->
|
|
||||||
<VSSDKTargetPlatformRegRootSuffix>RoslynDev</VSSDKTargetPlatformRegRootSuffix>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Mark the VSIX as a per-computer install (not-per-user). Putting a component "in the box"
|
|
||||||
requires this, and trying to change it after doing a release has lot of problems.
|
|
||||||
-->
|
|
||||||
<ExtensionInstallationRoot>CommonExtensions</ExtensionInstallationRoot>
|
|
||||||
<ExtensionInstallationFolder>Microsoft\Blazor</ExtensionInstallationFolder>
|
|
||||||
|
|
||||||
<!-- This should be set as true if we're ever building the VSIX for inclusion by the VS installer. -->
|
|
||||||
<IsProductComponent>false</IsProductComponent>
|
|
||||||
|
|
||||||
<!-- Update the VSToolsPath to ensure VSIX builds -->
|
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
|
||||||
<!-- Other projects should not reference this assembly. It is only meaning to be used in Visual Studio. -->
|
|
||||||
<IsProjectReferenceProvider>false</IsProjectReferenceProvider>
|
|
||||||
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<UseCodebase>true</UseCodebase>
|
|
||||||
<GeneratePkgDefFile>true</GeneratePkgDefFile>
|
|
||||||
<DeployProjectOutput Condition="'$(ContinuousIntegrationBuild)' == 'true'">false</DeployProjectOutput>
|
|
||||||
<DisablePackageReferenceRestrictions>true</DisablePackageReferenceRestrictions>
|
|
||||||
|
|
||||||
<!-- The Resources.resx is a embedded resource -->
|
|
||||||
<GenerateResxSource>false</GenerateResxSource>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Since the VSSDK doeesn't support SDK-based projects, we have to use the long/verbose version.
|
|
||||||
|
|
||||||
This section has all of the things we need to customize to the VSIX correctly. Everything outside
|
|
||||||
this section is just standard "old-csproj" boilerplate.
|
|
||||||
|
|
||||||
BEGIN INTERESTING STUFF
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<!--
|
|
||||||
Include this assembly in the VSIX but not its symbols, except when installing it to the experimental
|
|
||||||
instance.
|
|
||||||
-->
|
|
||||||
<IncludeAssemblyInVSIXContainer>true</IncludeAssemblyInVSIXContainer>
|
|
||||||
<IncludeDebugSymbolsInVSIXContainer>false</IncludeDebugSymbolsInVSIXContainer>
|
|
||||||
<IncludeDebugSymbolsInLocalVSIXDeployment>true</IncludeDebugSymbolsInLocalVSIXDeployment>
|
|
||||||
<!--
|
|
||||||
Always include assemblies and symbols in the output directory.
|
|
||||||
-->
|
|
||||||
<CopyBuildOutputToOutputDirectory>true</CopyBuildOutputToOutputDirectory>
|
|
||||||
<CopyOutputSymbolsToOutputDirectory>true</CopyOutputSymbolsToOutputDirectory>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<Target Name="PreCreateVsixContainer" BeforeTargets="GetVsixSourceItems" Condition="'$(TargetOsName)' == 'win' AND '$(TargetArchitecture)' != 'arm'">
|
|
||||||
<ItemGroup>
|
|
||||||
<_TemplatePackage Include="$(ArtifactsShippingPackagesDir)Microsoft.AspNetCore.Blazor.Templates.*.nupkg" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Error Text="No template files found." Condition="@(_TemplatePackage->Count()) == 0" />
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<VSIXSourceItem Include="@(_TemplatePackage)">
|
|
||||||
<VSIXSubPath>ProjectTemplates\</VSIXSubPath>
|
|
||||||
</VSIXSourceItem>
|
|
||||||
</ItemGroup>
|
|
||||||
</Target>
|
|
||||||
<!--
|
|
||||||
This is needed to support our infrastructure's automatic upload of symbols to the symbol server
|
|
||||||
for debugging.
|
|
||||||
|
|
||||||
The official build will set $(SymbolsPublishDir) and provide an additional place where the symbols
|
|
||||||
ought to be copied for publishing. This will noop otherwise.
|
|
||||||
-->
|
|
||||||
<Target Name="CopySymbolsToOutput" AfterTargets="Build" Condition="'$(SymbolsPublishDir)' != ''">
|
|
||||||
<Copy SourceFiles="$(OutDir)$(AssemblyName).pdb" DestinationFolder="$(SymbolsPublishDir)" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="CodeSnippets.pkgdef" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
<Content Include="Templates.pkgdef" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
<Content Include="CodeSnippets\Blazor\para.snippet" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
<Content Include="Content\WebConfiguration.png" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
<Content Include="Resources\BlazorPackage.ico" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
|
|
||||||
<Content Include="..\..\..\THIRD-PARTY-NOTICES.txt" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true">
|
|
||||||
<Link>Content\THIRD-PARTY-NOTICES.txt</Link>
|
|
||||||
</Content>
|
|
||||||
<Content Include="$(RepoRoot)LICENSE.txt" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true">
|
|
||||||
<Link>Content\LICENSE.txt</Link>
|
|
||||||
</Content>
|
|
||||||
|
|
||||||
<None Include="source.extension.vsixmanifest" SubType="Designer" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference
|
|
||||||
Include="..\..\Templates\src\Microsoft.AspNetCore.Blazor.Templates.csproj"
|
|
||||||
ReferenceOutputAssembly="false"
|
|
||||||
Private="false"
|
|
||||||
Targets="Build;Pack" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Shell.15.0" Version="15.7.27703" />
|
|
||||||
<PackageReference Include="StreamJsonRpc" Version="1.5.43" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<!-- Resources are a little bit special in a VSIX -->
|
|
||||||
<PropertyGroup>
|
|
||||||
<EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Include="Resources.resx">
|
|
||||||
<MergeWithCTO>true</MergeWithCTO>
|
|
||||||
<ManifestResourceName>VSPackage</ManifestResourceName>
|
|
||||||
</EmbeddedResource>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="PresentationCore" />
|
|
||||||
<Reference Include="PresentationFramework" />
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Design" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Windows.Forms" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
|
|
||||||
|
|
||||||
<!-- These need to be set after Sdk.targets because $(VersionSuffixDateStamp) is empty before Sdk.targets is evaluated. -->
|
|
||||||
<PropertyGroup>
|
|
||||||
<!--
|
|
||||||
Following VS convention of using the VS release # as a convention for the vsix version.
|
|
||||||
|
|
||||||
VS needs this build number to be parsable by System.Version, so it can't have any letters or a - which
|
|
||||||
is used by our build system.
|
|
||||||
-->
|
|
||||||
<VsixVersion Condition="'$(VersionSuffixDateStamp)' != ''">16.0.$(VersionSuffixDateStamp).$(VersionSuffixBuildOfTheDay)</VsixVersion>
|
|
||||||
<!-- For local development, set this 42 so its always higher than officil builds. -->
|
|
||||||
<VsixVersion Condition="'$(VersionSuffixDateStamp)' == ''">42.42.42.4242424</VsixVersion>
|
|
||||||
<InformationalVersion>$(VsixVersion)</InformationalVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
||||||
|
|
@ -1,132 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<data name="110" xml:space="preserve">
|
|
||||||
<value>ASP.NET Core Blazor Language Services</value>
|
|
||||||
<comment>About dialog title</comment>
|
|
||||||
</data>
|
|
||||||
<data name="112" xml:space="preserve">
|
|
||||||
<value>Provides Visual Studio support for ASP.NET Core Blazor</value>
|
|
||||||
<comment>About dialog description</comment>
|
|
||||||
</data>
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="400" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>Resources\BlazorPackage.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 418 KiB |
|
|
@ -1,2 +0,0 @@
|
||||||
[$RootKey$\TemplateEngine\Templates\Blazor\0.8.0]
|
|
||||||
"InstalledPath"="$PackageFolder$\ProjectTemplates"
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
|
|
||||||
<Metadata>
|
|
||||||
<Identity Id="Microsoft.VisualStudio.BlazorExtension" Version="|%CurrentProject%;GetVsixVersion|" Language="en-US" Publisher="Microsoft" />
|
|
||||||
<DisplayName>Blazor</DisplayName>
|
|
||||||
<Description xml:space="preserve">Provides Visual Studio support for Blazor</Description>
|
|
||||||
<License>Content\LICENSE.txt</License>
|
|
||||||
<PackageId>Microsoft.VisualStudio.BlazorExtension</PackageId>
|
|
||||||
<GettingStartedGuide>https://go.microsoft.com/fwlink/?linkid=870449</GettingStartedGuide>
|
|
||||||
<ReleaseNotes>https://go.microsoft.com/fwlink/?linkid=870448</ReleaseNotes>
|
|
||||||
<Icon>Content\WebConfiguration.png</Icon>
|
|
||||||
<PreviewImage>Content\WebConfiguration.png</PreviewImage>
|
|
||||||
</Metadata>
|
|
||||||
<Installation AllUsers="true">
|
|
||||||
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[16.2,)" />
|
|
||||||
</Installation>
|
|
||||||
<Assets>
|
|
||||||
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
|
|
||||||
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="File" Path="Templates.pkgdef" />
|
|
||||||
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="File" Path="CodeSnippets.pkgdef" />
|
|
||||||
</Assets>
|
|
||||||
<Prerequisites>
|
|
||||||
<Prerequisite Id="Microsoft.VisualStudio.Component.Web" Version="[16.0,)" DisplayName="ASP.NET and web development tools" />
|
|
||||||
</Prerequisites>
|
|
||||||
</PackageManifest>
|
|
||||||
|
|
@ -201,8 +201,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Ne
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.JsonPatch", "..\Features\JsonPatch\src\Microsoft.AspNetCore.JsonPatch.csproj", "{DC47C40A-FC38-44E4-94A4-ADE794E76309}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.JsonPatch", "..\Features\JsonPatch\src\Microsoft.AspNetCore.JsonPatch.csproj", "{DC47C40A-FC38-44E4-94A4-ADE794E76309}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.BlazorExtension", "blazor\BlazorExtension\src\Microsoft.VisualStudio.BlazorExtension.csproj", "{9088E4E4-B855-457F-AE9E-D86709A5E1F4}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BB236B66-28C0-49DD-9CD4-C4673CD4E7B4}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BB236B66-28C0-49DD-9CD4-C4673CD4E7B4}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
..\..\.editorconfig = ..\..\.editorconfig
|
..\..\.editorconfig = ..\..\.editorconfig
|
||||||
|
|
@ -1328,18 +1326,6 @@ Global
|
||||||
{DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x64.Build.0 = Release|Any CPU
|
{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.ActiveCfg = Release|Any CPU
|
||||||
{DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x86.Build.0 = 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
|
|
||||||
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
|
@ -1593,7 +1579,6 @@ Global
|
||||||
{3FAF725B-A628-4531-9F61-499660CD4347} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{3FAF725B-A628-4531-9F61-499660CD4347} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{04262990-929C-42BF-85A9-21C25FA95617} = {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}
|
{DC47C40A-FC38-44E4-94A4-ADE794E76309} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF}
|
|
||||||
{ED210157-461B-45BB-9D86-B81A62792C30} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{ED210157-461B-45BB-9D86-B81A62792C30} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{DA137BD4-F7F1-4D53-855F-5EC40CEA36B0} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{DA137BD4-F7F1-4D53-855F-5EC40CEA36B0} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{0CDAB70B-71DC-43BE-ACB7-AD2EE3541FFB} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{0CDAB70B-71DC-43BE-ACB7-AD2EE3541FFB} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@
|
||||||
"Components\\test\\Microsoft.AspNetCore.Components.Tests.csproj",
|
"Components\\test\\Microsoft.AspNetCore.Components.Tests.csproj",
|
||||||
"Server\\src\\Microsoft.AspNetCore.Components.Server.csproj",
|
"Server\\src\\Microsoft.AspNetCore.Components.Server.csproj",
|
||||||
"Server\\test\\Microsoft.AspNetCore.Components.Server.Tests.csproj",
|
"Server\\test\\Microsoft.AspNetCore.Components.Server.Tests.csproj",
|
||||||
"blazor\\BlazorExtension\\src\\Microsoft.VisualStudio.BlazorExtension.csproj",
|
|
||||||
"test\\E2ETest\\Microsoft.AspNetCore.Components.E2ETests.csproj",
|
"test\\E2ETest\\Microsoft.AspNetCore.Components.E2ETests.csproj",
|
||||||
"test\\testassets\\BasicTestApp\\BasicTestApp.csproj",
|
"test\\testassets\\BasicTestApp\\BasicTestApp.csproj",
|
||||||
"test\\testassets\\ComponentsApp.App\\ComponentsApp.App.csproj",
|
"test\\testassets\\ComponentsApp.App\\ComponentsApp.App.csproj",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue