gpt4 book ai didi

c# - 在 Visual C# 2010 中获取 DTE2 对象的引用

转载 作者:可可西里 更新时间:2023-11-01 08:56:56 24 4
gpt4 key购买 nike

我想获得对当前解决方案的引用,在 Visual Studio 2010 中使用 DTE2 对象和 C#。

我首先尝试了以下代码:

var dte = Marshal.GetActiveObject("VisualStudio.DTE.10.0") as EnvDTE80.DTE2;

但是当我打开 2 个解决方案并且此代码在第一个解决方案中时,我得到的不是对当前解决方案的引用,而是对我加载的最后一个解决方案的引用。我需要当前的解决方案...

在网上搜索,在How do you get the current solution directory from a VSPackage?中找到了以下解决方案:

// Get an instance of the currently running Visual Studio IDE
DTE dte = (DTE)GetService(typeof(DTE));

但是当我使用它时,我的 dte 对象总是 NULL。

那么,如何在 .net Framework 4.0 上使用 C# 在 VS2010 中获取我当前的解决方案对象?

最佳答案

经过大量搜索和尝试后,我终于使用添加到 MSDN 页面的评论得到了答案:http://msdn.microsoft.com/en-us/library/ms228755.aspx

我在我的 C# 项目中添加了一个静态类:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using EnvDTE80;

[DllImport("ole32.dll")]
private static extern void CreateBindCtx(int reserved, out IBindCtx ppbc);
[DllImport("ole32.dll")]
private static extern void GetRunningObjectTable(int reserved, out IRunningObjectTable prot);

internal static DTE2 GetCurrent()
{

//rot entry for visual studio running under current process.
string rotEntry = String.Format("!VisualStudio.DTE.10.0:{0}", Process.GetCurrentProcess().Id);
IRunningObjectTable rot;
GetRunningObjectTable(0, out rot);
IEnumMoniker enumMoniker;
rot.EnumRunning(out enumMoniker);
enumMoniker.Reset();
IntPtr fetched = IntPtr.Zero;
IMoniker[] moniker = new IMoniker[1];
while (enumMoniker.Next(1, moniker, fetched) == 0)
{
IBindCtx bindCtx;
CreateBindCtx(0, out bindCtx);
string displayName;
moniker[0].GetDisplayName(bindCtx, null, out displayName);
if (displayName == rotEntry)
{
object comObject;
rot.GetObject(moniker[0], out comObject);
return (EnvDTE80.DTE2)comObject;
}
}
return null;
}

此时我想访问当前的 IDE:

var dte = CurrentIde.GetCurrent();
var sol = dte.Solution;

但请记住……此代码在调试期间将不起作用!!!以字符串 rotEntry... 开头的代码行调用 Process.GetCurrentProcess 以获取当前进程的 ID。

在我的插件中调试某些功能时(使用 MME http://mme.codeplex.com/),我调用了一个需要当前 IDE 的方法。我使用调用插件方法的 ConsoleApp 对此进行了测试。在获取当前 IDE 时,当前进程不是 IDE,而是 ConsoleApp.vshost.exe。所以我的代码在调试期间没有工作,但在构建插件并安装此插件后 DID 工作。

关于c# - 在 Visual C# 2010 中获取 DTE2 对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4724381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com