ImageOptimizer - 按步骤更新 Visual Studio 扩展
本指南将以案例研究的形式介绍添加 Visual Studio 2022 支持同时使用图像优化器扩展维护 Visual Studio 2019 支持所需的所有步骤。
该指南非常完整,包含各个步骤的 Git 提交链接,但你也可在此处查看最终 PR:https://github.com/madskristensen/ImageOptimizer/pull/46。
本指南还在末尾处提供了其他示例。
步骤 1 - 对项目进行现代化改造
请参阅对项目进行现代化改造。
首先,在项目的“属性”页下将 VSIX 和单元测试项目提升至 .NET 4.7.2:
映像优化器引用一些旧版的自定义 14.* 和 15.* 包,而我们将安装合并所有所需引用的 Microsoft.VisualStudio.Sdk
NuGet 包。
- <ItemGroup>
- <PackageReference Include="Madskristensen.VisualStudio.SDK">
- <Version>14.0.0-beta4</Version>
- </PackageReference>
- <PackageReference Include="Microsoft.VSSDK.BuildTools">
- <Version>15.8.3247</Version>
- <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
- <PrivateAssets>all</PrivateAssets>
- </PackageReference>
- </ItemGroup>
+ <ItemGroup>
+ <PackageReference Include="Microsoft.VisualStudio.SDK">
+ <Version>16.9.31025.194</Version>
+ </PackageReference>
+ </ItemGroup>
生成项目成功,我们收到一些线程警告。 修复这些警告,方法是单击 ctrl
和 .
并使用 IntelliSense 添加缺少的线程切换行。
步骤 2 - 将源代码重构到共享项目中
请参阅共享项目。
支持 Visual Studio 2022 需要添加新的共享项目,该项目将包含要在 Visual Studio 2019 和 Visual Studio 2022 VSIX 项目之间共享的扩展源代码。
将新的共享项目添加到解决方案
向 VSIX 项目添加对共享项目的引用。
将源代码文件(cs、xaml、resx)移动到新的共享项目,以下文件除外:
source.extension.vsixmanifest
- 扩展元数据文件(图标、许可证、发行说明等)
- VSCT 文件
- 链接文件
- 需要包含在 VSIX 中的外部工具或库
现在将所有元数据、VSCT 文件、链接文件和外部工具/库移动到共享位置,并将它们作为链接项添加回 VSIX 项目。 请勿删除
source.extension.vsixmanifest
。- 对于此项目,我们需要将扩展图标、VSCT 文件和外部工具移动到新文件夹
ImageOptimizer\Resources
。 将它们复制到共享文件夹,并从 VSIX 项目中删除它们。 - 将它们作为链接项添加回来,如果这些项已经为链接项,则保持原样即可(例如许可证)。
- 通过选择每项并检查属性工具窗口,验证是否在添加的链接文件中正确设置生成操作和其他属性。 对于项目,我们必须设置以下内容:
将
icon.png
生成操作设置为Content
,并将已标记的“VSIX 中包含”设置为true
将
ImageOptimizer.vsct
生成操作设置为VSCTComplile
,并将“VSIX 中包含”设置为false
将
Resources\Tools
下文件的所有生成操作都设置为Content
,并将标记的“VSIX 中包括”设置为true
此外,
ImageOptimizer.cs
是ImageOptimizer.vsct
的一个依赖项,因此必须将此依赖项手动添加到 csproj 文件:- <Content Include="..\SharedFiles\ImageOptimizer.vsct"> - <Link>ImageOptimizer.vsct</Link> - </Content> - <Compile Include="..\SharedFiles\ImageOptimizer.cs"> - <Link>ImageOptimizer.cs</Link> - </Compile> + <VSCTCompile Include="..\SharedFiles\ImageOptimizer.vsct"> + <ResourceName>Menus.ctmenu</ResourceName> + <Generator>VsctGenerator</Generator> + <LastGenOutput>..\SharedFiles\ImageOptimizer.cs</LastGenOutput> + </VSCTCompile> + <Compile Include="..\SharedFiles\ImageOptimizer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>..\SharedFiles\ImageOptimizer.vsct</DependentUpon> + </Compile>
如果属性工具窗口阻止你设置特定的生成操作,可以按上述方式手动修改 csproj,根据需要设置生成操作。
- 对于此项目,我们需要将扩展图标、VSCT 文件和外部工具移动到新文件夹
生成项目以验证更改并修复错误/问题。 请查看常见问题解答部分,了解常见问题。
步骤 3 - 添加 Visual Studio 2022 VSIX 项目
将新的 VSIX 项目添加到解决方案。
删除新项目中除
source.extension.vsixmanifest.
以外的所有其他源代码添加对共享项目的引用。
从 Visual Studio 2019 VSIX 项目添加链接文件,并验证这些文件的“生成操作”和“在 VSIX 中包括”属性是否匹配。 此外,请复制
source.extension.vsixmanifest
文件,稍后我们将对其进行修改,以支持 Visual Studio 2022。尝试的生成显示缺少对
System.Windows.Forms
的引用。 只需将其添加到我们的 Visual Studio 2022 项目并进行重新生成。+ <Reference Include="System.Windows.Forms" />
升级对 Visual Studio 2022 版本的
Microsoft.VisualStudio.SDK
和Microsoft.VSSDK.BuildTools
包引用。注意
这些是编写本指南时可用的最新版本。 建议获取可用的最新版本。
-<PackageReference Include="Microsoft.VisualStudio.SDK" Version="16.0.206" /> +<PackageReference Include="Microsoft.VisualStudio.SDK" Version="17.0.0-preview-1-31216-1036" /> -<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="16.10.32" /> +<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="17.0.63-Visual Studio 2022-g3f11f5ab" />
编辑
source.extension.vsixmanifest
文件以反映目标为 Visual Studio 2022。设置
<InstallationTarget>
标记以反映 2022 并指示 amd64 有效负载:<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)"> <ProductArchitecture>amd64</ProductArchitecture> </InstallationTarget>
修改“先决条件”,以仅包括 Visual Studio 2022 及更高版本:
- <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[15.0,)" DisplayName="Visual Studio core editor" /> + <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[17.0,)" DisplayName="Visual Studio core editor" />
大功告成!
这样一来,生成现在会生成 Visual Studio 2019 和 Visual Studio 2022 VSIX。
其他示例
- ProPower 工具
- PeekF1
- 支持在 Web 浏览器中查看所选类/对象的帮助信息。
- FixMixedTabs
- 扫描文档,将制表符替换为空格,或将空格替换为制表符
- PeekF1
后续步骤
请阅读此完整流程指南,为更新扩展做好准备。