将 VSIX 功能添加到 C# 类库



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

(我实际上是在回答我自己的问题。这与Visual Studio 2017中的SIngle文件生成器更改有关 - 但这个问题并没有问我在这里回答的内容。

首先,

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

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 {

所有这些属性都将确保在 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>

这些东西大多是深奥的。在下一步中,我们将制作它,以便您可以使用设计器编辑此文件。

第三

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

<PropertyGroup>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)MicrosoftVisualStudiov$(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)VSSDKMicrosoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />

那么,我们在这里做了什么?让我们分解一下。

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

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

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

"UseCodeBase"元素很重要。此元素可防止您被迫向系统的 COM 注册表注册生成器。相反,Visual Studio将简单地从其安装位置加载您的生成器。

在底部,我们为VS-SDK导入MsBuild内容。

第四

加载项目备份。转到"项目属性"屏幕,你将在底部看到一个新的"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$SYSTEM32MSCOREE.DLL"
"Class"="MyCustomTool"
"CodeBase"="$PackageFolder$MyCustomTool.dll"
"ThreadingModel"="Both"

而且,我认为这是我写过的最长的SO答案。可能只有 5 个人会读到这个:)

如果类不是在类上实现IVsSingleFileGenerator,而是从抽象类继承BaseCodeGeneratorWithSite继承的抽象类BaseCodeGenerator实现IVsSingleFileGenerator则需要向类添加以下贡品,以避免错误消息"找不到自定义工具'...'在此系统上":

[ClassInterface(ClassInterfaceType.None)]

原因是抽象类BaseCodeGeneratorWithSite不可见。

最新更新