如何进行简单的VS扩展安装并在VS 2019,VS 2017和VS 2015中正常工作?

问题描述 投票:1回答:2

我使用VS 2019开发了一个简单的扩展。当我对其进行调试(即expive)时,它既适用于VS 2019,也适用于VS2017。我不知道如何将VS 2015添加到启动菜单,即此处:

enter image description here

因此,我在Release中构建了扩展(我更改了它,而不是将其部署到Release中的expheive中,然后运行:

C:\RunAdjustLocalApplicationHostConfigScriptVSExt [master ↓1 ↑1]> git clean -qdfx
C:\RunAdjustLocalApplicationHostConfigScriptVSExt [master ↓1 ↑1]> msbuild /restore /p:Configuration=Release /v:m
Microsoft (R) Build Engine version 15.9.21+g9802d43bc3 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

  Restoring packages for C:\RunAdjustLocalApplicationHostConfigScriptVSExt\src\RunAdjustLocalApplicationHostConfigScriptVSExt.csproj...
  Generating MSBuild file C:\RunAdjustLocalApplicationHostConfigScriptVSExt\src\obj\RunAdjustLocalApplicationHostConfigScriptVSExt.csproj.nuget.g.props.
  Generating MSBuild file C:\RunAdjustLocalApplicationHostConfigScriptVSExt\src\obj\RunAdjustLocalApplicationHostConfigScriptVSExt.csproj.nuget.g.targets.
  Restore completed in 817.27 ms for C:\RunAdjustLocalApplicationHostConfigScriptVSExt\src\RunAdjustLocalApplicationHostConfigScriptVSExt.csproj.
  RunAdjustLocalApplicationHostConfigScriptVSExt -> C:\RunAdjustLocalApplicationHostConfigScriptVSExt\src\bin\Release\RunAdjustLocalApplicationHostConfigScriptVSExt.dll
  RunAdjustLocalApplicationHostConfigScriptVSExt -> C:\RunAdjustLocalApplicationHostConfigScriptVSExt\src\bin\Release\RunAdjustLocalApplicationHostConfigScriptVSExt.vsix
C:\RunAdjustLocalApplicationHostConfigScriptVSExt [master ↓1 ↑1]> .\src\bin\Release\RunAdjustLocalApplicationHostConfigScriptVSExt.vsix
C:\RunAdjustLocalApplicationHostConfigScriptVSExt [master ↓1 ↑1]>

并且得到这个:

enter image description here

我尝试使用依赖项和先决条件,而我能得到的最好的结果是一个干净的安装对话框,提示它可以安装到VS的所有三个版本中,但实际上扩展名被破坏了-缺少错误参考。无论如何,现在都是失败,然后就是失败。

扩展名非常简单:

RunAdjustLocalApplicationHostConfigScriptVSExt.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <MinimumVisualStudioVersion>16.0</MinimumVisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>
  <PropertyGroup>
    <SignAssembly>false</SignAssembly>
  </PropertyGroup>
  <PropertyGroup>
    <AssemblyOriginatorKeyFile>
    </AssemblyOriginatorKeyFile>
  </PropertyGroup>
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <ProjectGuid>{A887F433-7EE5-47FC-9EE7-D06389A2E793}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>RunAdjustLocalApplicationHostConfigScriptVSExt</RootNamespace>
    <AssemblyName>RunAdjustLocalApplicationHostConfigScriptVSExt</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <GeneratePkgDefFile>true</GeneratePkgDefFile>
    <UseCodebase>true</UseCodebase>
    <IncludeAssemblyInVSIXContainer>true</IncludeAssemblyInVSIXContainer>
    <IncludeDebugSymbolsInVSIXContainer>false</IncludeDebugSymbolsInVSIXContainer>
    <IncludeDebugSymbolsInLocalVSIXDeployment>false</IncludeDebugSymbolsInLocalVSIXDeployment>
    <CopyBuildOutputToOutputDirectory>true</CopyBuildOutputToOutputDirectory>
    <CopyOutputSymbolsToOutputDirectory>true</CopyOutputSymbolsToOutputDirectory>
    <StartAction>Program</StartAction>
    <StartProgram Condition="'$(DevEnvDir)' != ''">$(DevEnvDir)devenv.exe</StartProgram>
    <StartArguments>/rootsuffix Exp</StartArguments>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DeployExtension>False</DeployExtension>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="VSPackage.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Include="source.extension.vsixmanifest">
      <SubType>Designer</SubType>
    </None>
  </ItemGroup>
  <ItemGroup>
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Design" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.SDK" Version="16.0.202" ExcludeAssets="runtime" />
    <PackageReference Include="Microsoft.VSSDK.BuildTools" Version="16.3.2099" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="Resources\VSPackage.ico" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Include="VSPackage.resx">
      <DependentUpon>VSPackage.cs</DependentUpon>
      <MergeWithCTO>true</MergeWithCTO>
      <ManifestResourceName>VSPackage</ManifestResourceName>
    </EmbeddedResource>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="$(VSToolsPath)\VSSDK\Microsoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>

source.extension.vsixmanifest

<?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="RunAdjustLocalApplicationHostConfigScriptVSExt.c6c6888b-d5e0-4861-96be-bb0cc8812d6d" Version="0.0.19323.36172" Language="en-US" Publisher="Kharitonov, Mark" />
    <DisplayName>RunAdjustLocalApplicationHostConfigScriptVSExt</DisplayName>
    <Description xml:space="preserve">Runs the script Tools\\MSBuild\\AdjustLocalApplicationHostConfig.ps1, if found.</Description>
  </Metadata>
  <Installation>
    <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[15.0, 16.0)" />
    <InstallationTarget Version="[16.0,)" Id="Microsoft.VisualStudio.Community" />
    <InstallationTarget Version="[14.0,15.0)" Id="Microsoft.VisualStudio.Community" />
  </Installation>
  <Dependencies>
    <Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="[4.5,)" />
    <Dependency d:Source="Installed" Id="Microsoft.VisualStudio.MPF.16.0" DisplayName="Visual Studio MPF 16.0" Version="[16.0,17.0)" />
  </Dependencies>
  <Prerequisites>
    <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[16.1.28811.260,17.0)" DisplayName="Visual Studio core editor" />
  </Prerequisites>
  <Assets>
    <Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
  </Assets>
</PackageManifest>

VSPackage.cs

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Events;
using Task = System.Threading.Tasks.Task;

namespace RunAdjustLocalApplicationHostConfigScriptVSExt
{
    [Guid(PACKAGE_GUID_STRING)]
    [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
    [ProvideAutoLoad("B0BAC05D-0000-41D1-A6C3-704E6C1A3DE2", PackageAutoLoadFlags.BackgroundLoad)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string, PackageAutoLoadFlags.BackgroundLoad)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string, PackageAutoLoadFlags.BackgroundLoad)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionHasMultipleProjects_string, PackageAutoLoadFlags.BackgroundLoad)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionHasSingleProject_string, PackageAutoLoadFlags.BackgroundLoad)]
    public sealed class VSPackage : AsyncPackage
    {
        public const string PACKAGE_GUID_STRING = "812e8a96-c440-49cb-84d8-531b2d99f696";
        private string m_scriptPath;
        private bool m_solutionOpen;

        protected override Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
        {
            SolutionEvents.OnAfterOpenSolution += SolutionEvents_OnAfterOpenSolution;
            SolutionEvents.OnBeforeOpenSolution += SolutionEvents_OnBeforeOpenSolution;
            SolutionEvents.OnAfterOpenProject += SolutionEvents_OnAfterOpenProject;
            return Task.FromResult(default(object));
        }

        private void SolutionEvents_OnAfterOpenSolution(object sender, OpenSolutionEventArgs e)
        {
            m_solutionOpen = true;
            RunScript();
        }

        private void SolutionEvents_OnAfterOpenProject(object sender, OpenProjectEventArgs e)
        {
            RunScript();
        }

        private void RunScript()
        {
            if (!m_solutionOpen || m_scriptPath == null)
            {
                return;
            }

            var psi = new ProcessStartInfo
            {
                FileName = "powershell",
                Arguments = $"-NoProfile -ExecutionPolicy Bypass -NonInteractive -File {m_scriptPath}",
                CreateNoWindow = true,
                LoadUserProfile = false,
                UseShellExecute = false,
                WindowStyle = ProcessWindowStyle.Hidden,
            };
            Process.Start(psi);
        }

        private void SolutionEvents_OnBeforeOpenSolution(object sender, BeforeOpenSolutionEventArgs e)
        {
            m_solutionOpen = false;
            m_scriptPath = null;
            var dir = e.SolutionFilename;
            while (dir.Length > 3)
            {
                dir = Path.GetDirectoryName(dir);
                var scriptPath = Path.Combine(dir, "Tools\\MSBuild\\AdjustLocalApplicationHostConfig.ps1");
                if (File.Exists(scriptPath))
                {
                    m_scriptPath = scriptPath;
                    return;
                }
            }
        }
    }
}

它所做的只是在加载解决方案或项目后运行特殊脚本。

我无法理解要在VS 2019,VS 2017和VS 2015上进行干净安装和正常工作需要做些什么。我之所以必须支持后者,是因为我们仍有Silverlight代码需要调试。 >

编辑1

按照谢尔盖·弗拉索夫(Sergey Vlasov)的回答,我更改了source.extension.vsixmanifest并降级了NuGet依赖项:

  • Microsoft.VisualStudio.SDK-从16.0.202到15.9.3
  • Microsoft.VSSDK.BuildTools
  • -从16.5.5到15.9.3032

    并且加载到三个版本中,但仅适用于VS 2017和VS2019。在VS 2015中,没有错误,但也没有扩展的影响。好像已安装但未使用。

编辑2

嗯,我切换到VS 2015并在那里开发了它。因为我看不到如何在VS 2019或VS 2017上使用v14 SDK。

在VS 2015中效果很好,但是将其安装到VS 2017会显示以下内容:

The following extensions are not compatible with the selected version of Visual Studio. Installation may cause Visual Studio to be unstable.

- RunAdjustLocalApplicationHostConfigScriptVSExt

enter image description here

如何避免?

P.S。

此问题与How to make VS 2017 run some custom code after any project is loaded?有关>>

我使用VS 2019开发了一个简单的扩展。当我调试它(​​即exphive)时,它既可以在VS 2019和VS 2017上运行。我不知道如何将VS 2015添加到启动菜单,即:在这里,我...

visual-studio visual-studio-2017 visual-studio-extensions
2个回答
0
投票
要在VS 2015-2019中安装扩展,您需要调整source.extension.vsixmanifest:

  1. 删除依赖项d:Source =“已安装” Id =“ Microsoft.VisualStudio.MPF.16.0” DisplayName =“ Visual Studio MPF 16.0” Version =“ [16.0,17.0)”

0
投票
最后对我有用的是:
© www.soinside.com 2019 - 2024. All rights reserved.