我正在为Visual Studio 2010及更高版本的C#开发VSPackage。该软件包使用户能够通过IDE中的菜单(以及其他功能)启用/禁用软件包的功能。
目标: 当启用包功能时,我想提出一些环境变量,但只有当应用程序在“调试模式”(Debug> Start Debugging [F5])中运行时才会设置它,例如: VS_COOL_PKG_ENABLE = 1
我希望这个env变量对debugee(正在调试的应用程序)可见。
无效的解决方案:
1. 环境变化:调用 Environment.SetEnvironmentVariable,它不起作用,因为程序包位于IDE(devenv.exe)的地址空间中,VS调试程序(msvsmon.exe)是一个不同的进程(devenv.exe的子进程)只有在IDE启动时才会创建,因此我在父进程(IDE)中进行的任何后续更改都不会反映在VS调试器中,因此应用程序(调试器的子进程)也不会看到它们。 / p>
为什么? 因为当我在“调试模式”下运行我的项目时,Debugee的进程树是这样的: IDE(devenv.exe)> VS Debugger(msvsmon.exe)>应用
以及我进行更改的阶段(在应用程序启动之前): IDE(devenv.exe)> VS Debugger(msvsmon.exe)
所以“VS Debugger”没有注意到环境的变化。
2. 项目属性: 通过以编程方式修改解决方案中所有项目的“环境”设置,我找到了一种解决方法 (即项目属性>配置属性>调试>环境) 使用VCDebugSettings.Environment属性。
但是这个解决方案的缺点是:
底线 我想动态引发这个环境变量,但只有在用户“Starts with Debugging”时才会引发它。
也许在EnvDTE(Visual Studio自动化模型)中有一些API /事件使我能够在开始调试之前“注入”环境变量,或者在VS调试器进程(msvsmon.exe)的上下文中调用函数,并且我可以设置环境变量,然后当应用程序产生时(由调试器)它将看到更改。
我愿意接受涉及黑客攻击的答案,例如this one。