如何创建SQL Server Management Studio 18 (SSMS)扩展





5.00/5 (10投票s)
关于如何开始开发SSMS扩展的教程。
引言
这将是一步一步的指南,介绍如何创建自己的 SQL Server Management Studio 18 扩展(以下简称 SSMS)。它将只涵盖入门所需的基本设置和步骤。它算是《创建你自己的 SQL Server Management Studio 17 (SSMS) 扩展》教程的一个更新,如果你已经熟悉那个教程,就没必要再看这个了,因为大部分内容仍然适用。尽管这是一个更新,但它会再次完整地涵盖所有步骤,所以没有阅读过那个教程的人仍然可以单独通过这个教程开始创建自己的扩展。所以,如果你是新来的,你应该跳过下一节,直接前往背景或要求部分,如果你不想被我写这个教程的原因所困扰的话。如果你阅读过之前的教程,只想了解有哪些变化,那么你应该只阅读下一节,其中涵盖了为 SSMS 的先前版本和当前版本开发扩展之间的差异。
如果你已经阅读了《创建你自己的 SQL Server Management Studio 17 (SSMS) 扩展》教程
从那时起,只有少数几件事发生了变化,所以如果你已经熟悉了之前的教程,你只需快速浏览一下这个列表就可以开始了。
- SSMS 可执行文件(运行和调试扩展所需)的默认安装位置现在是
C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\
- 扩展文件夹的位置现在是
C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Extensions\
- 日志文件的位置现在是
C:\Users\Username\AppData\Roaming\Microsoft\AppEnv\15.0\
- 不再需要变通方法(这使得之前教程的一半内容完全无用)
微软的 SSMS 团队最终决定取消只允许列入白名单的包 ID 加载到 SSMS 的限制。现在你只需开发你的扩展,它就可以正常工作了。
- 这次将使用 Visual Studio 2017
因为更新后的 SSMS 18 现在基于 VS 2017 隔离 Shell。
关于最后一点,还需要注意的是,由于程序集版本不兼容,用 Visual Studio 2015 开发的扩展可能无法在 SSMS 18 上正常工作。最简单的解决方法是在 VS 2017 中创建一个新项目,引用新的程序集(即相同程序集的较新版本),然后将所有扩展代码移到新的解决方案中,并尝试从那里运行。我最近在 SSMS 18 上运行和调试 Visual Studio 2015 的扩展时遇到了问题。在 VS 2017 中创建和运行一个新项目(引用相同程序集的较新版本)并将代码迁移过去进行调试解决了这个问题。
背景
SSMS 18 即将推出 (撰写本文时 RC1 已可用),我决定查看此版本的更新日志 (可在此处查看),希望能看到“完全支持深色主题”(没有成功) 或其他有趣的内容,这时我注意到以下信息:
引用开发 SSMS 扩展不再需要包 ID
你看,到目前为止,每个尝试开发 SSMS 扩展的人都知道,开始开发是一件痛苦的事。最大的原因是 SSMS 团队设定的这个限制,它不允许任何未列入白名单的扩展在启动时加载到 SSMS 中。结果,我们不得不进行一堆令人不快的黑客操作来规避这个限制,让我们的扩展工作。更糟糕的是,SSMS 扩展开发完全缺乏支持和文档,据我所知,这一点至今没有改变。我能找到的官方文档中最后一次提到 SSMS 可扩展性是在 SQL Server 2014 的页面中(可在此处查看),其中指出:
引用SQL Server Management Studio 构建于 Visual Studio 隔离 Shell 之上,它本身支持扩展性(加载项/插件)。可以利用 Visual Studio 扩展性服务在 SQL Server Management Studio 中提供自定义功能;但是,这种扩展性不受支持。
尽管取消白名单检查的决定让事情变得更容易,但据我所知,扩展仍然没有得到官方支持,我们仍然需要从网上寻找关于扩展 SSMS 的资源,而这些资源寥寥无几。幸运的是,由于它们共享相同的隔离 shell,因此创建 Visual Studio 扩展的教程有时会有所帮助,并且这样的教程有很多(官方文档可在此处查看)。缺乏官方文档和在线资源是创建本教程的原因。
要求
由于 SSMS 18 基于 VS 2017 隔离 Shell,我建议在创建扩展时使用此版本的 Visual Studio。由于程序集版本兼容性问题,使用其他版本的 Visual Studio(甚至更新的版本)会带来一系列麻烦,我强烈不建议这样做。在本教程中,我将在全新安装的 Windows 10 上使用全新安装的 Visual Studio 2017 和 SSMS 18 RC1。因此,如果这些步骤对我有效,我几乎可以保证只要您使用上述软件和版本,它们对您也有效。本节没有太多其他要说的,除了确保在安装 Visual Studio 时安装 Visual Studio 扩展开发工具集,因为您需要安装此工具集才能在创建新项目时获得“可扩展性”部分和 VSIX 项目类型。
如果您没有安装此工具集,您仍然可以通过运行位于以下位置的 Visual Studio 安装程序将其添加到 Visual Studio 中:
C:\Program Files (x86)\Microsoft Visual Studio\Installer\vs_installer.exe
并在现有安装上点击修改。
文件 > 新建项目
我们的 SSMS 扩展将以 Visual Studio 扩展的形式开始,然后转移到 SSMS 中。要开始我们的项目,在 Visual Studio 中,我们首先转到 文件 > 新建 > 项目... 并选择位于 已安装 > Visual C# > 扩展性 部分的 VSIX 项目 模板。
让我们将项目命名为 HelloWorldSsms18Extension
,然后点击确定。
为了让我们的扩展程序真正做些什么,我们将通过右键单击“解决方案资源管理器”中的项目并选择“添加 > 新项...”来在“工具”菜单中添加一个命令。
从这里,我们需要从“已安装 > Visual C# 项 > 扩展性 > VSPackage”部分选择“自定义命令”项。让我们将命令命名为“HelloWorldCommand”,然后点击“添加”。
所以,是的……差不多就是这样了。我们的扩展完成了。为了测试它是否实际工作以及我们是否可以调试它,我们将在 HelloWorldCommand
类的 Execute
方法(位于 HelloWorldCommand.cs 文件中)中添加一个断点,然后点击 Visual Studio 中的 播放/启动(现在命名为当前实例...)按钮。
如果到目前为止一切顺利,点击“开始”按钮应该会启动一个新的 Visual Studio 实例(称为“实验实例”),我们应该在“工具”菜单中看到我们的命令。如果这是您第一次运行“实验实例”,您可能需要等待一段时间,但是一旦它启动,我们就可以在其中找到我们的命令。
如果我们运行该命令(通过点击它),我们可以看到我们的断点被命中(在 Visual Studio 的开发实例中),如果我们点击继续,我们的实验实例将再次出现在视图中,显示一个消息框,这正是根据我们命令的 Execute
方法中的代码所期望看到的结果。
我想微软忘记更新此消息的文本了,因为该方法不再像以前版本的自定义命令中那样被称为 MenuItemCallback(现在它被称为 Execute)。您可以在之前的教程截图中看到这一点。
现在我们可以关闭消息框和实验实例,回到 Visual Studio 的开发实例,更改消息框应该显示的消息,然后尝试再次运行它,以确保一切按预期工作。
在确认我们的扩展加载和工作正常,并且我们可以无问题地调试它之后,我们终于可以将我们的扩展从 Visual Studio 移动到 SSMS 了。
迁移到 SSMS
如果我们想在 SSMS 中看到我们的扩展运行,我们需要做几件事。首先,我们希望当我们点击开始按钮时,SSMS 而不是另一个 Visual Studio 加载。要解决这个问题,我们需要右键单击“解决方案资源管理器”中的项目并选择属性,进入项目属性。
在属性窗口中,我们需要转到调试选项卡,并将“启动外部程序”属性更改为
C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Ssms.exe
使 Visual Studio 在调试扩展时启动 SSMS。这是 SSMS 18 的默认安装位置。如果您的 SSMS 未安装在此处,只需点击浏览按钮,在您的计算机上找到 Ssms.exe 可执行文件,然后点击打开。与此同时,我们也可以更改“命令行参数”字段,并在其中放入 /log
参数。这将使 SSMS 在运行时记录其活动,如果我们的扩展出现问题,这可以帮助我们进行故障排除。日志文件的位置是
C:\Users\Username\AppData\Roaming\Microsoft\AppEnv\15.0\ActivityLog.xml
更改并点击保存后,我们可以点击现在更名后的开始按钮,查看 SSMS 是否已加载我们的扩展。
好的,SSMS 确实启动了。让我们关闭“连接到服务器”窗口,检查我们的扩展是否在“工具”菜单中。
嗯……我们有 SSMS,但我们的扩展无处可寻。原因是我们的扩展不在 SSMS 启动时通常查找要加载的扩展的文件夹中。该文件夹的位置是
C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Extensions\
为了解决这个问题,我们需要告诉 Visual Studio 在构建项目时将扩展文件复制到该位置。我们可以在项目属性窗口的 VSIX 选项卡中通过选中“将 VSIX 内容复制到以下位置”复选框并在下面的 textbox
中输入 SSMS 扩展文件夹位置(加上我们扩展的文件夹名称)来完成此操作。假设要创建的文件夹名称为 HelloWorldSsms18Extension
,这样,textbox
中的完整路径应该为
C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\
Common7\IDE\Extensions\HelloWorldSsms18Extension
保存更新后的属性并再次点击开始。
好的,出错了,因为现在 Visual Studio 甚至不会构建项目。
如果我们点击“否”并检查“错误列表”窗口中的错误,我们可以看到 Visual Studio 无法将扩展文件复制到提供的路径。这可以通过以管理员身份运行 Visual Studio 轻松解决,所以关闭 Visual Studio 并再次运行,但这次要以管理员身份运行。
Visual Studio 加载后,再次点击开始。这次,项目在没有错误的情况下构建成功,并且 SSMS 也已启动。如果我们关闭“连接到服务器”窗口并在工具菜单中查看,我们可以看到我们的扩展就在那里,恰好位于它应该出现的位置。
如果我们点击菜单项,我们可以看到 Visual Studio 中的断点被命中(这意味着调试正常工作),如果我们点击继续,我们可以在 SSMS 中看到我们的消息框显示(这意味着我们的扩展正常工作)。
差不多就是这样了。这个扩展的功能不多,但它是创建自己扩展的一个很好的起点。我们的开发环境和项目终于为开发 SSMS 扩展做好了准备。所以……
接下来做什么?
嗯,我真的不知道。最好的办法是在 GitHub 上寻找扩展项目,以获取一些想法和查看一些代码示例,这些对创建自己的扩展非常有帮助。不幸的是,这样的项目不多,但也有一些(底部的一些在之前的教程中提到过),这些确实能帮上忙。除此之外,我想就谷歌一下吧,但正如我之前多次提到的,网上关于 SSMS 扩展的信息并不多。查看 Visual Studio 扩展的教程,因为它们非常相似,并且在尝试弄清楚如何实现某些特定功能时(例如将命令按钮放置在“工具”菜单以外的其他位置(例如,右键上下文菜单)或获取当前活动的编辑器窗口)可以提供很大的价值。
祝你好运...
注意:与之前的教程不同,本教程不包含任何可下载的代码或项目文件,因为启动此类项目的过程不需要编写任何代码,您只需按照步骤并查看提供的图像即可重现上述结果。