如何使用 VS Package 在解决方案资源管理器中获取所选项目的项目类型 Guid

2023-11-29

我创建了简单的 VS 包,用于在解决方案资源管理器的上下文菜单中添加新项目。我需要检查所选项目的项目类型 GUID。我怎样才能得到这个。

例如,一个解决方案包含三种不同类型的项目,如 WindowFormsApplication、MVC 项目、WebApplication。在选择 MVC 项目时,我们需要获取该项目类型 GUID。

我在我的 Package.cs 中尝试了以下操作,

IVsMonitorSelection monitorSelection = (IVsMonitorSelection)Package.GetGlobalService(typeof(SVsShellMonitorSelection));

monitorSelection.GetCurrentSelection(out hierarchyPtr, out projectItemId, out mis, out selectionContainerPtr);

IVsHierarchy hierarchy = Marshal.GetTypedObjectForIUnknown(hierarchyPtr, typeof(IVsHierarchy)) as IVsHierarchy;

if (hierarchy != null)
{
     object prjItemObject;
     hierarchy.GetProperty(projectItemId, (int)__VSHPROPID.VSHPROPID_ExtObject, out    prjItemObject);
     string projectTypeGuid;
      Project prjItem = prjItemObject as Project;
      projectTypeGuid = prjItem.Kind;
}

对于所有选定的项目,我获得的 GUID 为“FAE04EC0-301F-11D3-BF4B-00C04F79EFBC”。

有人可以帮我这个吗?


我已经找到了这个问题的答案

参考:https://www.mztools.com/articles/2007/MZ2007016.aspx

public string GetProjectTypeGuids(EnvDTE.Project proj)
        {
            string projectTypeGuids = "";
            object service = null;
            Microsoft.VisualStudio.Shell.Interop.IVsSolution solution = null;
            Microsoft.VisualStudio.Shell.Interop.IVsHierarchy hierarchy = null;
            Microsoft.VisualStudio.Shell.Interop.IVsAggregatableProject aggregatableProject = null;
            int result = 0;
            service = GetService(proj.DTE, typeof(Microsoft.VisualStudio.Shell.Interop.IVsSolution));
            solution = (Microsoft.VisualStudio.Shell.Interop.IVsSolution)service;

            result = solution.GetProjectOfUniqueName(proj.UniqueName, out hierarchy);

            if (result == 0)
            {
                aggregatableProject = (Microsoft.VisualStudio.Shell.Interop.IVsAggregatableProject)hierarchy;
                result = aggregatableProject.GetAggregateProjectTypeGuids(out projectTypeGuids);
            }

            return projectTypeGuids;
        }

        public object GetService(object serviceProvider, System.Type type)
        {
            return GetService(serviceProvider, type.GUID);
        }

        public object GetService(object serviceProviderObject, System.Guid guid)
        {
            object service = null;
            Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider = null;
            IntPtr serviceIntPtr;
            int hr = 0;
            Guid SIDGuid;
            Guid IIDGuid;

            SIDGuid = guid;
            IIDGuid = SIDGuid;
            serviceProvider = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)serviceProviderObject;
            hr = serviceProvider.QueryService(ref SIDGuid, ref IIDGuid, out serviceIntPtr);

            if (hr != 0)
            {
                System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(hr);
            }
            else if (!serviceIntPtr.Equals(IntPtr.Zero))
            {
                service = System.Runtime.InteropServices.Marshal.GetObjectForIUnknown(serviceIntPtr);
                System.Runtime.InteropServices.Marshal.Release(serviceIntPtr);
            }

            return service;
        }
    }

它工作正常,适合我的要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 VS Package 在解决方案资源管理器中获取所选项目的项目类型 Guid 的相关文章

  • Visual Studio Extend IDE - 异常助手

    这里的目的是合并堆栈溢出Visual Studio 的异常助手中的常见答案 I have trawled the web without luck the only information I could find about custom
  • 绑定时出现方法或操作未实现错误

    我目前正在开发一个 Visual Studio 插件 VSPackage 它最终应该能够可视化调用关系 为了代表他们我想用图 库它管理图形 避免重叠边缘等 不幸的是 我在运行时在 XAML 中收到以下错误消息 XamlParseExcept
  • 如何使用 VS Package 在解决方案资源管理器中获取所选项目的项目类型 Guid

    我创建了简单的 VS 包 用于在解决方案资源管理器的上下文菜单中添加新项目 我需要检查所选项目的项目类型 GUID 我怎样才能得到这个 例如 一个解决方案包含三种不同类型的项目 如 WindowFormsApplication MVC 项目
  • 是否有 Visual Studio 插件的配置类型文件?

    创建 Visual Studio 加载项时 如何利用该加载项的 app config 如果我向项目添加一个并部署它 那么当加载项运行并且我以编程方式尝试通过 ConfigurationManager AppSettings 访问它时 它不会
  • 如何从 VSPackage 获取当前运行的 Visual Studio 安装路径

    我创建了一个VSPackage这应该将一些 XML 架构文件复制到 Visual Studio 的安装路径 VS install path Xml Schemas 我的机器上安装了多个 Visual Studio Visual Studio
  • 如何向 Visual Studio 扩展添加其他工具窗口?

    创建扩展时适用于 Visual Studio 2013默认情况下会设置一个工具窗口 不过 我想要一个second工具窗口 看不到应该如何去做 我创建了一个指南 如何 使用 Visual Studio 包中的 ToolWindowPane 类
  • 如何在 VSIX 包安装上注册键绑定代码

    我只想在安装期间向 Visual Studio 包添加一次键盘快捷键 基本上我知道如何从包代码中做到这一点 例如 var dte GetGlobalService typeof DTE as DTE2 if dte null dte Com
  • 如何在 vspackage 中获取当前解决方案配置?

    我正在制作 Visual Studio 包 我需要知道打开的解决方案名称和配置 我怎样才能得到这些信息 如果您有 EnvDTE 的参考 您可以使用dte Solution and dte Solution SolutionBuild Act
  • Visual Studio Extensions - 支持多个版本的VS

    我一直在编写一个扩展 编辑器分类器项目 带有一些其他功能 它在 VS2013 上运行良好 但我需要支持其他版本 VS2012 和 VS2015 当它超出预览时 当我刚刚添加支持的版本时vsixmanifest 我面临的问题是 出口ITest
  • 使用 vspackage 将上下文菜单项添加到解决方案资源管理器中的所有文件和文件夹

    我想将菜单项添加到解决方案资源管理器中所有文件和文件夹的上下文菜单中 我能够使用 vsct 文件中的此条目将菜单项添加到项目节点 menu type Context menu
  • Visual Studio 2010 的 HWnd

    有没有办法从 VSIX 扩展获取指向 Visual Studio 2010 顶部窗口的 HWnd 指针 我想更改窗口的标题 由于您的 VSIX 扩展很可能会与 Visual Studio 一起在进程内运行 因此您应该尝试以下操作 Syste
  • 如何从 Visual Studio 解决方案中获取所有界面类型?

    我正在尝试编写 Visual Studio 的扩展 我需要获取当前打开的所有项目中找到的所有接口类型的列表solution 到目前为止 我已经尝试使用 EnvDev 命名空间来执行此操作 有没有办法在不解析项目的 cs 文件的情况下执行此操
  • 在 Visual Studio 扩展中,如何检测调试器何时继续

    我需要 Visual Studio 扩展来对调试事件做出反应 我已经注册了一个IDebugEventCallback2我正在接收事件 但我为每个事件得到的只是一个不透明的IDebugEvent2和一个 Guid 其中许多不仅没有记录 而且不
  • 使用 DTE 激活 Visual Studio 的输出窗口

    我创建了一个自定义输出窗口窗格 for my VSPackage 使用此代码 Creating Output Window for our package IVsOutputWindow output GetService typeof S
  • 在多台机器上开发时无法运行 VSPackage

    我们正在团队中使用 Visual Studio 2012 和 TFS 开发 VSPackage The extension works fine on the computer used to create it through a wiz
  • VS 2012 扩展中的标准控件

    我目前正在更改公司内部的 VS 扩展以支持 Visual Studio 2012 我正在努力解决的是如何使 UI 动态适应活动的 VS 主题 我找到了几个颜色 画笔的资源键 Microsoft VisualStudio Shell 11 0
  • 如何向 Visual Studio Intellisense 添加按钮

    我想在 Visual Studio 的 IntelliSense 返回的选项列表的顶部添加一个按钮 单击该按钮时 将执行我的自定义代码 这将导致出现弹出窗口 我将其称为 按钮 因为当用户单击该项目时 我希望出现一个弹出窗口 而不是完成用户输
  • 在 VS 包项目中获取 dte2 或 TeamFoundationServerExt 对象?

    我正在开发一个 Visual Studio Package 项目 该项目需要连接到我们的 TFS 要读取当前连接 我需要 TeamFoundationServerExt 对象 我应该能够从 dte2 对象中获取该对象 现在我找到了数百个示例
  • 连接到 Visual Studio 中的构建过程

    我正在编写一个 Visual Studio 扩展 它允许编辑项目中特定类型的文件 该文件用作进一步自动代码生成的描述 类似于实体框架 我需要在构建项目之前执行代码生成 其中包含描述文件 代码生成算法 当前 放置在描述文件的编辑器内 有没有办
  • Visual Studio 2010 可扩展性、MPF 和语言服务

    我正在尝试扩展 Visual Studio 2010 RC 以能够使用自定义编程语言 我尝试做的前两件事是语法突出显示 智能感知功能 很容易完成 感谢 PDC09 中的 Ook 示例 和创建新项目模板的可能性 即能够打开 myproj 文件

随机推荐