Visual Studio 2010自动化和环境变量

6

我正在使用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设置。 - coffeetocode
2个回答

2
在您的环境中自行启动devenv,然后通过运行对象表(ROT)获取正在运行的Visual Studio实例,这是否可能?
// 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实例,可能会遇到问题,但这也很容易解决。您可以获得一个特定的VS实例,只需要知道自己启动的VS实例的进程ID即可。

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


这非常有趣!我得先检查一下。谢谢! - wilx

0

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

在此屏幕上,您可以设置用户变量和系统变量。也许您希望应用程序查找的设置存储在用户而不是系统下,然后在不同用户下打开应用程序会导致这些变量不可用?

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


不,更改全局环境变量不是选项。我需要这些变量从创建COM对象的进程中继承。 - wilx
@wilx 抱歉,我看不到任何访问(非当前)进程环境的方法。奇怪的是,我也找不到任何(可靠的)来源证明它是不可能的。虽然出于安全原因,这也可能是不可能的。 - Miika L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接