1

我正在为 Visual Studio 2010 及更高版本开发 C# 中的VSPackage。该软件包使用户能够通过 IDE 中的菜单启用/禁用软件包的功能(以及它所做的其他事情)。

目标:启用包功能后,我想提出一些环境变量,但仅在应用程序在“调试模式”(调试>开始调试 [F5])下运行时设置,例如:VS_COOL_PKG_ENABLE=1

我希望这个 env 变量对被调试者(被调试的应用程序)可见。

无效的解决方案

1.环境更改:调用 Environment.SetEnvironmentVariable,它不起作用,因为包位于IDE(devenv.exe)的地址空间中,而VS调试器(msvsmon.exe)是不同的进程(devenv的子进程) .exe) 仅在 IDE 启动后创建,因此我在父进程 (IDE) 中所做的任何后续更改都不会反映在 VS 调试器中,因此应用程序(调试器的子进程)将看不到它们也是。

这是为什么?因为当我在“调试模式”下运行我的项目时,被调试者的进程树是这样的:IDE (devenv.exe) > VS Debugger (msvsmon.exe) > Application

我进行更改的阶段是(在应用程序启动之前):IDE(devenv.exe)> VS Debugger(msvsmon.exe)

所以“VS Debugger”忽略了环境的变化。

2.项目属性:我找到了一种解决方法,通过使用 VCDebugSettings.Environment 属性以编程方式修改解决方案中所有项目的“环境”设置(即项目属性 > 配置属性 > 调试 > 环境)。

但是这个解决方案的缺点是:

  • 当用户“开始调试”(Ctrl+F5)时也会设置环境变量
  • 它与用户设置混淆,这不是一个干净的解决方案

底线 我想动态提升这个环境变量,但只有在用户“开始调试”时才提升它。

也许 EnvDTE(Visual Studio 自动化模型)中有一些 API/事件使我能够在它开始调试之前“注入”环境变量,或者在 VS 调试器进程 (msvsmon.exe) 的上下文中调用函数,然后通过它我可以设置环境变量,然后当应用程序(由调试器)生成时,它将看到更改。

我愿意接受涉及黑客的答案,例如这个

4

0 回答 0