65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (22投票s)

2002 年 12 月 4 日

7分钟阅读

viewsIcon

87933

downloadIcon

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 不同,不会执行缓慢的全解决方案依赖性检查。
  • 如果正在进行调试会话,系统会提示用户在构建开始前关闭调试会话。
  • 还展示了“正确”安装/卸载插件的示例。

无安装程序安装

  1. 解压存档。
  2. 关闭 Visual Studio .NET。
  3. 运行 regsvr32 FastSolutionBuild.dll

安装程序提供了更大的易用性,包括卸载功能,并且应尽可能使用它。

设置键盘绑定

  1. 重新打开 Visual Studio .NET。
  2. 选择接受或不接受默认的 Fast Solution Build 键盘绑定。
  3. 如果需要,您可以为宏安装一个按键绑定
    1. 转到 工具 -> 选项 -> 键盘
    2. 如果键盘映射方案从未创建自定义副本,请按 另存为 按钮并命名您的按键绑定。
    3. 显示包含的命令: 中,键入 FastSolutionBuild
    4. 单击 FastProjectBuild.Connect.BuildActiveProject
    5. 转到 按快捷键
    6. F7(或您想要的按键)。
    7. 单击 分配
    8. 单击 FastProjectBuild.Connect.RunActiveProject
    9. 转到 按快捷键
    10. F5(或您想要的按键)。
    11. 单击 分配
    12. 单击 确定

用法

解决方案资源管理器中**加粗**的项目是 Fast Solution Build 宏构建的顶级项目。要将另一个项目设为“启动”项目,请右键单击所需项目并选择 设置为启动项目

从“工具”菜单运行 Fast Solution BuildBuildActiveProjectRunActiveProject 命令,或按分配给插件命令的键盘按键。

技术详情

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.ConnectHKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\PreloadAddinStatePreloadAddinState 键告诉 Visual Studio .NET 强制创建插件命令。通常,VS.NET 会缓存插件命令和工具栏条目。不幸的是,它的缓存效果不太好,经常会丢失这些设置。

DllUnregisterServer() 演示了几个重要函数。首先,会删除插件的注册表项,包括 GUID、tlb 等。最后,Fast Solution Build 实际上连接到 VS.NET COM 对象并删除其注册的命令。如果插件创建了一个工具栏(Fast Solution Build 只将命令添加到“工具”菜单),这也是删除该工具栏的合适位置。

CConnect::OnConnection() 的代码与 AppWizard 生成的样板代码有很大的不同。它执行以下步骤

  1. m_pDTEm_pAddInInstance 设置为 NULL。在开发 Workspace Whiz 时,VS.NET 多次调用 OnConnection() 函数而没有调用 OnDisconnection()。将这些值设置为 NULL 可确保重复调用 OnConnection() 不会崩溃。
  2. 测试是否从命令行启动。这并非适用于所有命令行情况,但涵盖了其中一些。
  3. 在函数执行期间,大块代码被包装在 try-catch 块中。从命令行构建启动时,例如请求 CommandBars 对象,会导致 Visual Studio 抛出异常,而不是返回正确的错误代码。尝试将命名命令添加到 Commands 对象时也会发生类似情况。即使您能够成功检索 Commands 对象,调用 AddNamedCommand() 也会导致 Visual Studio 抛出异常。
  4. 扫描“工具”菜单以查找 Fast Solution Build 命令。如果不存在,则重新创建它们。一些 VS .NET 崩溃不会保存命令图标信息,也不会再次调用 OnConnection() 并将 ConnectMode 设置为 5(这会导致重新创建工具栏项和插件命令)。此检查会强制重新创建命令,假设它们不存在。
  5. 同样,在 Workspace Whiz 中,曾出现因未调用 OnDisconnection() 而导致事件未正确取消注册的情况。这会导致整个 VS.NET 崩溃。Fast Solution Build 在取消注册事件处理程序之前会先注册它们。

Fast Solution Build 实现两个命令:BuildActiveProjectRunActiveProjectCConnect::Exec() 识别正确的命令并进行相应路由。

BuildActiveProject 通过执行以下步骤来工作

  1. 如果当前正在调试应用程序,则会弹出一个对话框询问用户是否要停止调试。如果用户选择否,BuildActiveProject 将退出。
  2. 与 VC6 一样,所有文件在构建前都会被保存。
  3. 通过函数 GetOutputWindowPane() 获取构建输出窗口窗格。它会被清除并显示一些文本。
  4. 如果解决方案、解决方案构建、构建依赖项或其他 EnvDTE 对象无法检索,BuildActiveProject 将以错误退出。
  5. 获取启动项目。启动项目附加到 CComSafeArray。如果您将 SAFEARRAY 附加到 CComSafeArray 并且不打算销毁它,请务必将其分离,否则 CComSafeArray 会将其销毁!
  6. 所有依赖项开始递归。
  7. 任何非 C/C++ 项目都会被忽略。
  8. 使用解决方案上下文的“是否构建项目”设置来忽略开发者在解决方案配置中关闭的任何项目。
  9. 遍历所有必需的依赖项。如果尚未进行依赖项检查,则返回到步骤 6。
  10. 为项目的上下文检索正确的配置和平台。
  11. 如果任何子依赖项已构建,则会自动强制构建父项目。
  12. 最后,获取 VCConfiguration.UpToDate 属性。这才是真正神奇的地方。看起来 Build Solution 命令会忽略 UpToDate 属性并始终调用 Build。事实上,如果在 Fast Solution Build 中没有检查 UpToDate,那么宏的行为与 Build Solution 没有区别!

RunActiveProjectBuildActiveProject 的基础上进一步扩展,增加了以下额外项

  1. 如果调试器处于活动状态,则不会执行解决方案构建。但是,会触发 Debug.Start 命令,以模拟调试菜单在单步执行或设置断点时的 Continue 行为。
  2. 将构建活动项目及其所有已更新的依赖项。

最后,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

  • 在某些情况下,使命令行构建不再崩溃。
  • 阻止了二次构建覆盖正在进行的构建。
© . All rights reserved.