将VSIX功能添加到C#类库

har*_*333 9 c# visual-studio vsix single-file-generator

我有一个现有的单文件生成器(位于C#类库中).如何将VSIX项目级功能添加到此项目中?最终目标是编译我的类库项目并获得VSIX.

(我实际上回答了我自己的问题.这与Visual Studio 2017中的SIngle文件生成器更改有关 - 但这个问题并没有问我在这里回答什么.)

har*_*333 27

首先,

您的单文件生成器类需要具有适当的类级属性:

using System.Runtime.InteropServices;
using Microsoft.VisualStudio.Shell;
using VSLangProj80;

[ComVisible(true)]
[Guid("your-unique-identifier")]
[CodeGeneratorRegistration(
    typeof(MyCustomTool),
    "MyCustomTool",
    vsContextGuids.vsContextGuidVCSProject,
    GeneratesDesignTimeSource = true,
    GeneratorRegKeyName = "MyCustomTool"
)]
[ProvideObject(
    typeof(MyCustomTool),
    RegisterUsing = RegistrationMethod.CodeBase
)]
public sealed class MyCustomTool : IVsSingleFileGenerator {
Run Code Online (Sandbox Code Playgroud)

所有这些属性都将确保在VSIX中正确生成.pkgdef文件..pkgdef文件包含用于向Visual Studio注册单文件生成器的注册表项.

第二,

将"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="MyCustomTool.MyCompany.another-random-guid" Version="1.0" Language="en-US" Publisher="MyCompany" />
    <DisplayName>MyCustomTool</DisplayName>
    <Description>Helpful information</Description>
  </Metadata>
  <Installation>
    <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[15.0]" />
  </Installation>
  <Dependencies>
    <Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="[4.5,)" />
  </Dependencies>
  <Prerequisites>
    <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[15.0,16.0)" DisplayName="Visual Studio core editor" />
  </Prerequisites>
</PackageManifest>
Run Code Online (Sandbox Code Playgroud)

大部分内容都非常深奥.在下一步中,我们将制作它,以便您可以使用设计器编辑此文件.

第三

(并回答原始问题),您需要处理.csproj文件(您的C#类库文件).具体来说,您需要添加以下内容:

<PropertyGroup>
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  <ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<ItemGroup>
  <None Include="source.extension.vsixmanifest">
    <SubType>Designer</SubType>
  </None>
</ItemGroup>
<PropertyGroup>
  <UseCodebase>true</UseCodebase>
</PropertyGroup>
<Import Project="$(VSToolsPath)\VSSDK\Microsoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />
Run Code Online (Sandbox Code Playgroud)

那么,我们在这做了什么?让我们分解吧.

首先,我们设置Visual Studio工具集位置的路径.毕竟,现在这是一个"扩展项目".因此,它需要知道VS-SDK的位置.

然后,我们更改了"ProjectTypeGuids"(可能不在您的项目文件中).最初,它只包含了C#的指南(这是"FAE04EC0 -..."guid).现在,它还包括VSIX的指南(这是"82b43b9b -..."guid).

我们还确保"source.extension.vsixmanifest"文件使用其新的,精美的设计器(而不是手动编辑文件).

"UseCodeBase"元素很重要.此元素可防止您被强制使用系统的COM注册表注册Generator.相反,Visual Studio只会从其安装位置加载您的Generator.

在底部,我们导入VS-SDK的MsBuild内容.

第四,

重新加载项目.转到Project Properties屏幕,您将在底部看到一个新的"VSIX"部分.打开该部分并选中"在构建期间创建VSIX容器"复选框.

此时,您还可以仔细检查"source.extension.vsixmanifest"文件.根据您的发电机的特殊程度,您可以根据需要进行更改.(我上面粘贴的文件的内容几乎就是我用于项目的内容.)

最后,

你可以编译你的项目.在bin文件夹中,您将找到MyCustomTool.dll和MyCustomTool.vsix..vsix文件只是一个zip文件.在.vsix中,你会找到MyCustomTool.pkgdef.

如果我们已正确完成所有操作,.pkgdef文件应如下所示:

[$RootKey$\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\MyCustomTool]
@="MyCustomTool"
"CLSID"="{your-unique-identifier}"
"GeneratesDesignTimeSource"=dword:00000001
[$RootKey$\CLSID\{your-unique-identifier}]
@="MyCustomTool"
"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL"
"Class"="MyCustomTool"
"CodeBase"="$PackageFolder$\MyCustomTool.dll"
"ThreadingModel"="Both"
Run Code Online (Sandbox Code Playgroud)

而且,我认为这是我写过的最长的答案.也许,只有5人会读到这个:)

  • 别担心,我是第6名 (3认同)
  • 我需要另外两件事来使它工作:(1)csproj必须包含`<GeneratePkgDefFile> true </ GeneratePkgDefFile>`,或者只需在Visual Studio中单击该项目并确保"生成.pkgdef文件"和"包含" VSIX中的程序集"属性"窗格中的选项为True.(2)我的SFG有两个基类; 每个人都需要`[ComVisible(true)]`属性(Eliseu的建议`[ClassInterface(ClassInterfaceType.None)]`对我来说不起作用). (2认同)