【问题标题】:Visual Studio 2010 automation and environment variablesVisual Studio 2010 自动化和环境变量
【发布时间】:2011-11-17 17:29:06
【问题描述】:

我正在使用 C# 和 VS2010 自动化打开 VS2010 解决方案。我打开这样的解决方案:

Type type = Type.GetTypeFromProgID("VisualStudio.DTE.10.0", true);
Object comObject = Activator.CreateInstance(type);
...
sol.Open(solution_full_path);

我遇到的问题是,当我创建VisualStudio.DTE.10.0 对象的实例时,它会从winlogon.exe 启动devenv.exe 进程,它看到的环境与我的应用程序完全不同。一些环境变量对于解析项目中设置的一些路径很重要。

有什么方法可以影响devenv.exe 进程的环境变量吗?有什么方法可以使用 VS2010 自动化接口注入环境/属性?

【问题讨论】:

  • 这个问题可能需要更多的上下文;你在这一切中的最终目标是什么?回归测试?批量修改解决方案文件?不同的技术适用于不同的情况和类型的环境影响。也就是说,您可能需要查看 Machine.config,它可以提供适用于在特定机器上创建的所有实例的 Visual Studio 设置。

标签: c# visual-studio visual-studio-2010 com automation


【解决方案1】:

是否可以在您的环境中自己启动 devenv。然后通过运行对象表 (ROT) 获取运行中的 Visual Studio Instance

// Get an instance of the currently running Visual Studio IDE.
EnvDTE80.DTE2 dte2;
dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.
GetActiveObject("VisualStudio.DTE.10.0");

如果您有多个正在运行的 VS 实例,您会遇到问题,但这也是一个简单的实例。您可以获取specific VS instance,您只需要知道您自己启动的 VS 实例的进程 ID。

Visual Studio 还将 ProgID 注册为 ROT 中的项目名字对象。 ProgID 由 DTE 进程的名称和进程 ID 组成。 因此,例如,对象的 ROT 条目可能是 "!VisualStudio.DTE.10.0:1234," 其中 1234 是进程 ID。

【讨论】:

  • 这很有趣!我得检查一下这个拳头。谢谢!
【解决方案2】:

不完全确定这是否是您要查找的内容,但可以更改 Windows 环境变量(假设为 Windows 7):控制面板 -> 系统和安全 -> 系统 -> 高级系统设置 -> 环境变量(按钮)。

在此屏幕中,您可以设置用户变量以及系统变量。也许您希望您的应用找到的设置存储在用户而不是系统下,然后在其他用户下打开应用会导致这些变量不可用?

创建您需要的变量作为系统变量会解决您的问题吗?

【讨论】:

  • 不,更改全局环境变量不是一种选择。我需要从创建 COM 对象的进程中继承变量。
  • @wilx 抱歉,我似乎找不到任何访问(非当前)进程环境的方法。不过奇怪的是,我找不到任何(可靠的)来源,这也是不可能的。不过,仅仅出于安全原因,这可能是不可能的。
猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2013-12-25
相关资源
最近更新 更多