Visual Studio .NET 的快速解决方案构建插件






4.50/5 (22投票s)
2002 年 12 月 4 日
7分钟阅读

87933

1256
对 VS .NET 多项目解决方案构建执行 VC6 风格的依赖性检查
在 http://workspacewhiz.com/ 的其他插件部分可以找到 Fast Solution Build 的新版本。
引言
从 Visual C++ 6 过渡到 Visual Studio .NET 时,多项目解决方案构建比 Visual C++ 6 的对应工作区慢了很多。对于在单个项目环境中工作的人来说,这种差异微乎其微。对于多项目解决方案,使用“构建解决方案”命令的痛苦会很快显现出来,因为它需要为解决方案的每个项目进行所有“依赖性检查”。
Fast Solution Build 模拟了 Visual C++ 6 的构建风格。它建立在原始的 Fast Project Build VBScript 宏概念的基础上,同时提供了更易用的界面和错误检查。此外,还提供了 Debug
命令。
特点
- 快速识别并仅构建已更改文件的项目。与
Build Solution
命令不同,不会执行缓慢的、针对每个项目的全解决方案依赖性检查。 - 如果在项目构建过程中发生错误,构建将立即停止。解决方案中的其余项目不会继续构建。
- 通过“运行活动项目”命令可以获得
Debug.Start
的等效功能。与Debug.Start
不同,不会执行缓慢的全解决方案依赖性检查。 - 如果正在进行调试会话,系统会提示用户在构建开始前关闭调试会话。
- 还展示了“正确”安装/卸载插件的示例。
无安装程序安装
- 解压存档。
- 关闭 Visual Studio .NET。
- 运行
regsvr32 FastSolutionBuild.dll
。
安装程序提供了更大的易用性,包括卸载功能,并且应尽可能使用它。
设置键盘绑定
- 重新打开 Visual Studio .NET。
- 选择接受或不接受默认的 Fast Solution Build 键盘绑定。
- 如果需要,您可以为宏安装一个按键绑定
- 转到 工具 -> 选项 -> 键盘。
- 如果键盘映射方案从未创建自定义副本,请按 另存为 按钮并命名您的按键绑定。
- 在 显示包含的命令: 中,键入 FastSolutionBuild。
- 单击 FastProjectBuild.Connect.BuildActiveProject。
- 转到 按快捷键。
- 按 F7(或您想要的按键)。
- 单击 分配。
- 单击 FastProjectBuild.Connect.RunActiveProject。
- 转到 按快捷键。
- 按 F5(或您想要的按键)。
- 单击 分配。
- 单击 确定。
用法
解决方案资源管理器中**加粗**的项目是 Fast Solution Build 宏构建的顶级项目。要将另一个项目设为“启动”项目,请右键单击所需项目并选择 设置为启动项目
。
从“工具”菜单运行 Fast Solution Build 的 BuildActiveProject 或 RunActiveProject 命令,或按分配给插件命令的键盘按键。
技术详情
Fast Solution Build 是 VBScript Fast Project Build 宏的 C++/ATL 增强版本。它演示了在开发 Workspace Whiz Visual Studio .NET 插件 时学到的许多插件概念。最重要的是,它阐述了我为稳定运行插件所发现的步骤。
首先,Fast Solution Build 完全能够通过简单的 regsvr32
调用来安装和卸载自身。特别是在调试时,不需要运行安装程序来安装和卸载插件,这更加方便。在 AddIn.cpp 中,DllRegisterServer()
负责注册服务器并连接插件的注册表项。关键的注册表项位于 HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\AddIns\FastSolutionBuild.Connect 和 HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\PreloadAddinState。PreloadAddinState 键告诉 Visual Studio .NET 强制创建插件命令。通常,VS.NET 会缓存插件命令和工具栏条目。不幸的是,它的缓存效果不太好,经常会丢失这些设置。
DllUnregisterServer()
演示了几个重要函数。首先,会删除插件的注册表项,包括 GUID、tlb 等。最后,Fast Solution Build 实际上连接到 VS.NET COM 对象并删除其注册的命令。如果插件创建了一个工具栏(Fast Solution Build 只将命令添加到“工具”菜单),这也是删除该工具栏的合适位置。
CConnect::OnConnection()
的代码与 AppWizard 生成的样板代码有很大的不同。它执行以下步骤
- 将
m_pDTE
和m_pAddInInstance
设置为NULL
。在开发 Workspace Whiz 时,VS.NET 多次调用OnConnection()
函数而没有调用OnDisconnection()
。将这些值设置为NULL
可确保重复调用OnConnection()
不会崩溃。 - 测试是否从命令行启动。这并非适用于所有命令行情况,但涵盖了其中一些。
- 在函数执行期间,大块代码被包装在 try-catch 块中。从命令行构建启动时,例如请求
CommandBars
对象,会导致 Visual Studio 抛出异常,而不是返回正确的错误代码。尝试将命名命令添加到Commands
对象时也会发生类似情况。即使您能够成功检索Commands
对象,调用AddNamedCommand()
也会导致 Visual Studio 抛出异常。 - 扫描“工具”菜单以查找 Fast Solution Build 命令。如果不存在,则重新创建它们。一些 VS .NET 崩溃不会保存命令图标信息,也不会再次调用
OnConnection()
并将ConnectMode
设置为5
(这会导致重新创建工具栏项和插件命令)。此检查会强制重新创建命令,假设它们不存在。 - 同样,在 Workspace Whiz 中,曾出现因未调用
OnDisconnection()
而导致事件未正确取消注册的情况。这会导致整个 VS.NET 崩溃。Fast Solution Build 在取消注册事件处理程序之前会先注册它们。
Fast Solution Build 实现两个命令:BuildActiveProject
和 RunActiveProject
。CConnect::Exec()
识别正确的命令并进行相应路由。
BuildActiveProject
通过执行以下步骤来工作
- 如果当前正在调试应用程序,则会弹出一个对话框询问用户是否要停止调试。如果用户选择否,
BuildActiveProject
将退出。 - 与 VC6 一样,所有文件在构建前都会被保存。
- 通过函数
GetOutputWindowPane()
获取构建输出窗口窗格。它会被清除并显示一些文本。 - 如果解决方案、解决方案构建、构建依赖项或其他
EnvDTE
对象无法检索,BuildActiveProject
将以错误退出。 - 获取启动项目。启动项目附加到
CComSafeArray
。如果您将SAFEARRAY
附加到CComSafeArray
并且不打算销毁它,请务必将其分离,否则CComSafeArray
会将其销毁! - 所有依赖项开始递归。
- 任何非 C/C++ 项目都会被忽略。
- 使用解决方案上下文的“是否构建项目”设置来忽略开发者在解决方案配置中关闭的任何项目。
- 遍历所有必需的依赖项。如果尚未进行依赖项检查,则返回到步骤 6。
- 为项目的上下文检索正确的配置和平台。
- 如果任何子依赖项已构建,则会自动强制构建父项目。
- 最后,获取
VCConfiguration.UpToDate
属性。这才是真正神奇的地方。看起来Build Solution
命令会忽略UpToDate
属性并始终调用Build
。事实上,如果在 Fast Solution Build 中没有检查UpToDate
,那么宏的行为与Build Solution
没有区别!
RunActiveProject
在 BuildActiveProject
的基础上进一步扩展,增加了以下额外项
- 如果调试器处于活动状态,则不会执行解决方案构建。但是,会触发
Debug.Start
命令,以模拟调试菜单在单步执行或设置断点时的Continue
行为。 - 将构建活动项目及其所有已更新的依赖项。
最后,Fast Solution Build 插入到几个 BuildEvents 中。当触发 OnBuildProjConfigDone
时,Fast Solution Build 会检查当前项目的构建过程中是否有任何错误。如果发现错误,它会通过 Build.Cancel
命令中止其余的构建。当触发 OnBuildDone
且没有发生构建错误时,会调用 Debug.Start
,从而使调试器变为活动状态。
已知bug
- 目前没有。
结论
请将任何评论、错误或修复报告给 jjensen@workspacewhiz.com - 谢谢。
编辑历史
2002 年 12 月 4 日 - 初次编辑
2002 年 12 月 5 日 - 版本 2.01
- 在某些情况下,使命令行构建不再崩溃。
- 阻止了二次构建覆盖正在进行的构建。