Tag: envdte

VS Extension:TextPoint.GreaterThan / LessThan对于大文件来说非常慢

我正在研究VS扩展,它需要知道文本光标当前位于哪个类成员(方法,属性等)。 它还需要父母的意识(例如,类,嵌套类等)。 它需要知道成员或类的类型,名称和行号。 当我说“类型”时我的意思是“方法”或“属性”不一定是“.NET类型”。 目前我在这里使用此代码: public static class CodeElementHelper { public static CodeElement[] GetCodeElementAtCursor(DTE2 dte) { try { var cursorTextPoint = GetCursorTextPoint(dte); if (cursorTextPoint != null) { var activeDocument = dte.ActiveDocument; var projectItem = activeDocument.ProjectItem; var codeElements = projectItem.FileCodeModel.CodeElements; return GetCodeElementAtTextPoint(codeElements, cursorTextPoint).ToArray(); } } catch (Exception ex) { Debug.WriteLine(“[DBG][EXC] – ” + ex.Message + ” […]

在VisualStudio DTE中,如何获取ActiveDocument的内容?

我在VisualStudio中编写脚本,并试图获取当前ActiveDocument的内容。 这是我目前的解决方案: var visualStudio = new API_VisualStudio_2010(); var vsDTE = visualStudio.VsAddIn.VS_Dte; var document = (Document)vsDTE.ActiveDocument; var textDocument = (TextDocument)document.Object(“TextDocument”); var editPoint = textDocument.StartPoint.CreateEditPoint(); var text = editPoint.GetText(textDocument.EndPoint.CreateEditPoint()); panel.clear().add_SourceCodeViewer() .set_Text(text, document.FullName.extension()); 这是最好的方法吗? 我得到了解决方案: 因为ActiveDocument.Text()太容易了…

不使用item.Document.FullName获取ProjectItem路径

我有一个visual studio插件项目,我必须遍历当前项目的项目,利用这些文件的绝对(或相对)路径。 item.Document.FullName有效,但仅适用于当前打开的文件。 有没有其他方法可以在DTE对象中访问此信息?

如何使用EnvDTE列出当前解决方案中的所有项目?

我一直在关注MSDN的Hello World指南来开发Visual Studio扩展 (本文专门讨论如何创建一个Visual Studio工具栏命令)。 我试图列出当前/活动解决方案中包含的所有项目。 在Command模板的自动生成代码中。 我曾尝试过EnvDTE的Solution的Projects属性,但它显示零项目。 还有一个ActiveSolutionProjects属性,但它也显示一个空数组。 这是如何实现的? PS:我尝试了DTE和DTE2接口,因为从文档中理解使用哪个版本令人困惑。 我得到DTE2的空服务,所以我要去DTE。 My Solution Explorer看起来像: 更新 :来自gitter / extendvs的 Bert Huijben建议在VSSDK可扩展性示例中找到以下内容 – 但这也不起作用(返回0个元素,在构造函数内和回调函数内): private Hashtable GetLoadedControllableProjectsEnum() { Hashtable mapHierarchies = new Hashtable(); IVsSolution sol = (IVsSolution)this.ServiceProvider.GetService(typeof(SVsSolution)); Guid rguidEnumOnlyThisType = new Guid(); IEnumHierarchies ppenum = null; ErrorHandler.ThrowOnFailure(sol.GetProjectEnum((uint)__VSENUMPROJFLAGS.EPF_LOADEDINSOLUTION, ref rguidEnumOnlyThisType, out ppenum)); IVsHierarchy[] rgelt = new IVsHierarchy[1]; […]

Visual Studio的当前构建操作类型 – Microsoft.VisualStudio.Shell.Interop

在某些扩展中,我们实现了用于使用AdviseUpdateSolutionEvents注册调用者的IVsUpdateSolutionEvents2和IVsSolutionBuildManager2 例如,在任何构建操作开始之前调用此方法: public int UpdateSolution_Begin(ref int pfCancelUpdate) { … } 但是,还需要获取当前构建操作的状态或类型,例如:build / rebuild / clean / deploy 可用和已知的变体: BuildEvents 使用Events.BuildEvents,我可以订阅OnBuildBegin,例如: _buildEvents.OnBuildBegin += new _dispBuildEvents_OnBuildBeginEventHandler((vsBuildScope Scope, vsBuildAction Action) => { buildType = (BuildType)Action; }); 并在任何地方使用buildType,因为vsBuildAction提供了所有必要的信息 但是UpdateSolution_Begin / UpdateSolution_StartUpdate首先作为优先级使用advising方法调用,因此buildType设置太晚了.. 我们也可以使用这个OnBuildBegin而不是UpdateProjectCfg_Begin / UpdateSolution_StartUpdate,但是我们的处理也需要尽快与优先调用者一起使用 IVsUpdateSolutionEvents4 IVsUpdateSolutionEvents4.UpdateSolution_BeginUpdateAction提供dwAction并在解决方案构建期间每个更新操作开始之前触发 – 在第一个UpdateProjectCfg_Begin之前 这正是我需要的! 因为dwAction我可以用VSSOLNBUILDUPDATEFLAGS查看 但是:(它出现在VS2012,我们的扩展支持VS2010和更高……所以也需要2010版本的变种 UpdateProjectCfg_Begin IVsUpdateSolutionEvents2.UpdateProjectCfg_Begin还提供dwAction(参见VSSOLNBUILDUPDATEFLAGS )并可用于2010版本,但它与第一​​个BuildEvents变体相同 – 处理时间太晚(并且不太适合我们的任务) 题 我找不到这方面的文档,但VSSOL可以为VS2010提供VSSOLNBUILDUPDATEFLAGS ,所以我认为应该是将其作为构建操作的当前状态的变体,例如,对于IVsHierarchy等__VSHPROPID和GetProperty […]

如何在Visual Studio中以编程方式执行“转到定义”?

给定一个表示特定类/字段/属性的字符串(例如MyNameSpace.MyClass或System.String.Length ),如何以编程方式使Visual Studio转到该类/字段/属性(即,使Visual Studio执行相同操作)如果我要在代码编辑器中输入引用然后点击F12,那会发生什么?

无法将DTE,项目或解决方案转换为VCProject和VCCodeModel

我试图通过代码获得有关c + =程序的一些信息。 我在EnvDTE上取得了一些成功,现在我需要使用VCProject和VCCodeModel,我遇到了投射问题(希望这就是全部…) 在工人阶级,我从Connect传递了DTE “application” 。 我有: EnvDTE.Project project = application.SelectedItems.Item(1).Project; EnvDTE.Solution sol = (EnvDTE.Solution)application.Solution; 我想使用“项目”,而不是解决方案中的第一个项目,就像我在网上找到的例子 – 如下所示 – 但大多数情况下,我希望有一些先行的。 对于VCProject,我尝试过(关闭Microsoft的网站,以及所有其他Web示例): VCProject vcProject = (VCProject)application.Solution.Projects.Item(1).Object; MessageBox.Show(vcProject.ProjectDirectory); 要不就 VCProject vcProject = (VCProject)project.Object; 对于VCCodeModel,我翻译为c# http : //msdn.microsoft.com/en-us/library/microsoft.visualstudio.vccodemodel.vccodeinclude.aspx : public void GetAllIncludes() { VCCodeModel vcCM = (VCCodeModel)application.Solution.Item(1).CodeModel; foreach (VCCodeInclude vcInclude in vcCM.Includes) { MessageBox.Show(vcInclude.DisplayName); } } 两者都给予例外: […]

通过EnvDTE以编程方式更改Visual Studio项目的Debug属性

以某种方式可以通过EnvDTE类以编程方式更改调试部分中的项目属性吗? 我知道如何获得DTE实例并使用一些设置,但我是盲目的或调试部分是无法访问的。 我从这里开始http://msdn.microsoft.com/en-us/library/envdte.project.dte.aspx

我怎样才能从解决方案中获得项目?

我得到了一个使用以下项目的列表: var solution = (IVsSolution)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(IVsSolution)); 有关详细信息,请参阅以下链接 但它给了我解决方案中的每个项目,如目录,项目等。我只需要项目。 我怎样才能从解决方案中获得项目?

永远不会执行加载项事件

我使用“Visual Studio的加载项”向导来创建一个新的Addin项目,现在,我正在尝试添加一些事件处理程序: public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; _applicationObject.Events.BuildEvents.OnBuildBegin += BuildEvents_OnBuildBegin; _applicationObject.Events.BuildEvents.OnBuildDone += BuildEvents_OnBuildDone; _applicationObject.Events.SelectionEvents.OnChange += SelectionEvents_OnChange; _applicationObject.Events.DocumentEvents.DocumentOpened += DocumentEvents_DocumentOpened; _applicationObject.Events.DocumentEvents.DocumentSaved += DocumentEvents_DocumentSaved; } 但无论我做什么,我的处理程序都不会被执行! 我瞎了吗? 我是否必须做任何其他事情来注册这些处理程序或为什么它不起作用?