Visual Studio .NET 自动构建环境插件






4.44/5 (8投票s)
2002年11月21日
4分钟阅读

107339

1157
为每个解决方案提供自定义全局环境构建设置的支持。
引言
自动构建环境插件使用一个名为 SolutionName.slnenv 的新文件,该文件位于与解决方案相同的目录中,用于提供针对给定解决方案文件的构建环境变量。 .slnenv 代表“解决方案环境”。 自动构建环境插件在打开解决方案时和每次构建开始之前执行此文件,并相应地重置构建的环境变量。
背景
我经常需要在启动 Visual Studio .NET 之前设置用于构建的环境变量。我最常用的环境变量用途是存储机器依赖的路径,通常用于预处理器包含设置。但是,我也将它们用于编译器的其他命令行选项。
与其修改每台机器的全局环境变量,不如向我的客户提供一个启动 Visual Studio .NET 的批处理文件。这需要一些技巧和一个用于读取注册表项的实用程序(例如 http://www.tamedos.com/downloads/downloads.htm 上的 DtReg)。下面的示例展示了 VS.NET 启动批处理文件。
rem StartVisualStudioNET.bat
set rp="\machine\software\Microsoft\VisualStudio\7.0\InstallDir"
for /f "tokens=1*" %%i in ('c:\dtreg -lv %rp%') do set VSDir=%%j
start /D"%VSDIR%" devenv.exe %*
我的自定义构建设置存储在另一个启动特定解决方案的批处理文件中。
rem MyProject.bat set MYPATH=%cd%\SomeDirectory set EXTRA_OPTS=/D MY_DEFINE call StartVisualStudioNET.bat %cd%\AnotherDirectory\MySolution.sln
每个需要这些构建设置的项目都会在预处理器包含中添加 $(MYPATH)
,并在其他命令行参数中添加 $(EXTRA_OPTS)
。
虽然可以忍受通过批处理文件启动 Visual Studio .NET 并使用自定义构建设置,但这肯定不方便。更糟糕的是,每次更改构建环境都需要关闭 IDE。我需要更好的方法,于是自动构建环境插件应运而生。
自动构建环境插件的新版本可以在 http://workspacewhiz.com/ 的 Misc. Code 部分找到。
不使用安装程序进行安装
- 解压缩存档。
- 关闭 Visual Studio .NET。
- 运行
regsvr32 AutoBuildEnvironment.dll
。 - 重新打开 Visual Studio .NET。
安装程序提供了更大的易用性,应尽可能使用。
用法
在 SolutionName.slnenv 文件中,每行一个条目,包含 environmentvariablename=value
条目。
MYPATH=c:\Src\MyDirectory\Include EXTRA_OPTS=/D MY_DEFINE
解决方案的路径可以通过名为 $(SolutionDir)
的变量获得。解决方案目录不包含终止反斜杠。
MYPATH=$(SolutionDir)\Include
解决方案的名称可以通过 $(SolutionName)
获得。
SOLNAME=$(SolutionName)\Include
可以使用 $(EnvironmentVariableName)
语法插入环境变量。这与批处理文件的 %EnvironmentVariableName%
替换语法具有相同的功能。
PATH=$(PATH);c:\Tools;$(MYPATH)\..\Bin
可以通过 %(HKLM\Path\Key)
或 %(HKCU\Path\Key)
访问简单的注册表项,其中 HKLM
访问 HKEY_LOCAL_MACHINE
,HKCU
访问 HKEY_CURRENT_USER
。只能检索字符串值。
MYPATH=%(HKLM\Software\MySoftware\Path)
可以将环境变量应用于特定的解决方案配置。其语法为 ConfigurationName:Name=Value
。
Debug:PATH=$(PATH);%(HKLM\Software\MySoftware\DebugPath) Release:PATH=$(PATH);%(HKLM\Software\MySoftware\DebugPath)
可以使用 include
或 forceinclude
关键字包含其他 .slnenv 文件。每个关键字后面的文件名不应包含 .slnenv 扩展名。
include $(HOMEDRIVE)$(HOMEPATH)\MyPersonalDefinitions
forceinclude ..\..\MandatoryDefinitions
注释以行首的 --
指定。
-- This is a comment.
示例
假设你正在构建一个名为 Game 的 DirectX 应用程序,但 DirectX 的 include 目录在不同机器上的位置不同。(通常,DirectX 的 include 目录是全局的,但这并非总是如此。)这是一个创建每个用户 .slnenv 文件的绝佳示例。首先,我们将一个 Game.slnenv 文件放在 Game.sln 的同一目录中。
-- Provide a reasonable default. DXPATH=c:\dxsdk -- Call the user .slnenv file so it can override. -- We don't use forceinclude so this is optional. include $(HOMEDRIVE)$(HOMEPATH)\UserDXPath -- Now, build the compile options. COMPILE_OPTS=/I "$(DXPATH)\Include"
UserDXPath.slnenv 文件可能如下所示:
-- The DirectX SDK is actually at the d:\Program Files\DXSDK directory. DXPATH=d:\Program Files\DXSDK
当运行 Game.sln 文件时,可以通过 $(DXPATH)
获得环境变量 DXPATH
,通过 $(COMPILE_OPTS)
获得 COMPILE_OPTS
。如果将 $(COMPILE_OPTS)
插入到命令行选项属性页中,构建将使用你的 DirectX 目录。
技术详情
自动构建环境插件使用 ATL 支持以 C++ 编写。它演示了如何挂接到解决方案事件和构建事件对象。它还演示了可以插入到 DllRegisterServer()
和 DllUnregisterServer()
中的附加代码,这些代码无需额外的安装脚本即可安装和卸载插件注册表项。
构建环境技术之所以有效,是因为插件在与 Visual Studio 的 devenv.exe 相同的进程空间中运行。从 IDE 启动的构建会继承 devenv.exe 的环境。调用 Win32 SetEnvironmentVariable()
函数可以操纵 IDE 环境。在设置新环境变量之前,会使用 GetEnvironmentVariable()
检索旧环境变量并将其存储,从而允许每个解决方案会话在纯净的环境中工作。
环境变量注册过程中唯一奇怪的地方发生在环境变量用于输出或中间目录时。即使自动构建环境插件在构建时会为每个解决方案配置重新配置环境,但输出和中间目录是在解决方案打开时由 Visual Studio .NET 一次性解析的。自动构建环境插件通过在解决方案打开时也读取 .slnenv 文件来弥补这一点。
在解决方案打开时应用 .slnenv 文件,在修改 PATH
等设置时也很有好处。新的 PATH
将在整个会话中可用,包括解决方案运行时。
已知bug
- 目前没有。
结论
我希望自动构建环境插件能对您有所帮助。如果您有意见或发现错误,请在此处或通过电子邮件 'jjensen@workspacewhiz.com' 报告。
谢谢,
Joshua Jensen
作者,自动构建环境插件
http://workspacewhiz.com/
编辑历史
2002 年 11 月 21 日 - 初始编辑