我有一个现有的单文件生成器(位于C#类库中)。如何将VSIX项目级功能添加到该项目?最终目标是编译我的类库项目并获得VSIX。
(我实际上是在回答自己的问题。这与SIngle-file generator changes in Visual Studio 2017有关,但该问题并不是在问我在这里回答什么。)
最佳答案
首先,
您的Single-File Generator类需要具有适当的类级别属性:
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”添加到您的项目。其“构建 Action ”应为“无”。给它一些默认的文本:
<?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)\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)' != ''" />
那么,我们在这里做了什么?让我们分解一下。
首先,我们设置一个指向Visual Studio工具集位置的路径。毕竟,这现在是一个“扩展项目”。因此,它需要知道VS-SDK的位置。
然后,我们更改了“ProjectTypeGuids”(开始时它可能不在您的项目文件中)。最初,它仅包含C#的GUID(即“FAE04EC0 -...” GUID)。现在,它还包括VSIX的GUID(即“82b43b9b -...” GUID)。
我们还确保“source.extension.vsixmanifest”文件使用其新的精美设计器(而不是手动编辑该文件)。
“UseCodeBase”元素很重要。该元素可防止您被迫向系统的COM注册表中注册Generator。而是,Visual Studio只会从安装位置加载Generator。
在底部,我们为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$\SYSTEM32\MSCOREE.DLL"
"Class"="MyCustomTool"
"CodeBase"="$PackageFolder$\MyCustomTool.dll"
"ThreadingModel"="Both"
而且,我认为这是我写的最长的答案。大概只有5个人会阅读:)
关于c# - 将VSIX功能添加到C#类库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42842406/