标签: visual-studio-package

Visual Studio包:设置自定义解决方案资源管理器上下文菜单项的可见性

我正在创建一个Visual Studio包(这是我的第一次),我的最终目标是为解决方案资源管理器创建一个仅适用于某些文件类型的上下文菜单项.(我认为这将是一个常见的事情,但没有找到任何体面的教程,所以如果你知道任何请告诉我)

我按照一个简单的MSDN指南首先在工具栏中创建一个项目(我忘记链接它的位置),这很好.

然后我找到了将其移动到Solution Explorer上下文菜单的方法.这是通过操作.vsct文件并具有如下元素来实现的:

<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>
Run Code Online (Sandbox Code Playgroud)

这可能没关系,但我试图设置场景.

现在,因为我只想显示某些文件类型的项目,所以我需要找到一种方法来在按下右键单击按钮时检查文件.缩短搜索时间,我找到了这个并最终得到以下代码:

protected override void Initialize()
{
    //stuff
    OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    menuItem.BeforeQueryStatus += menuItem_BeforeQueryStatus;
    //more stuff
}

void menuItem_BeforeQueryStatus(object sender, EventArgs e)
{
    var myCommand = sender as OleMenuCommand;
    myCommand.Text = "NEW NAME";
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我只是试图设置文本来尝试并证明它有效,我知道有一个Visible属性,但我希望这一步先工作.该BeforeQueryStatus事件被触发,并且调试显示代码按预期执行.但是,上下文菜单项没有变化,它保留原始文本.

我在这里错过了什么?为什么不更新?

c# visual-studio-2012 visual-studio-package

14
推荐指数
2
解决办法
3474
查看次数

从VSIX命令调用Roslyn

从EnvDTE.ProjectItem获取Roslyn的SyntaxTree的最佳方法是什么?我找到了另一种方法(Roslyn的Document into ProjectItem).

我从打开的文档中调用了VSIX命令,我想在那里试验Roslyn的语法树.

这段代码有效,但对我来说看起来很尴尬:

    var pi = GetProjectItem();
    var piName = pi.get_FileNames(1);

    var componentModel = (IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel));
    var workspace = componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>();
    var ids = workspace.GetOpenDocumentIds();
    var id1 = ids.First(id => workspace.GetFilePath(id) == piName);

        Microsoft.CodeAnalysis.Solution sln = workspace.CurrentSolution;
        var doc = sln.GetDocument(id1);
        //var w = await doc.GetSyntaxTreeAsync();
        Microsoft.CodeAnalysis.SyntaxTree syntaxTree;
        if (doc.TryGetSyntaxTree(out syntaxTree))
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法从活动文档中获取Roslyn的文档?

vsx vsix roslyn visual-studio-package visual-studio-2015

6
推荐指数
2
解决办法
1256
查看次数

如何确定EnvDTE.Project对象是否代表C/C++项目?

我有一个Project实例,我不明白如何找出项目类型/语言.具体来说,我需要检查一个C/C++项目.

文档似乎缺乏.

以前,另一个人在我的开源VS扩展中添加了以下一些魔法,它在VS2013-2015中有效:

private static bool isVisualCppProject(object project)
{
    Type projectObjectType = project.GetType();
    var projectInterface = projectObjectType.GetInterface("Microsoft.VisualStudio.VCProjectEngine.VCProject");
    return projectInterface != null;
}

   ...

isVisualCppProject(project.Object);
Run Code Online (Sandbox Code Playgroud)

但它不再适用于VS 2017 RC.而且我很乐意摆脱这种运行时反射魔法和un-typed objectdynamic不是Project- 因为这个代码已经变得不可维护了.

c# visual-studio visual-studio-extensions visual-studio-package

6
推荐指数
1
解决办法
603
查看次数

在运行时导出自定义EditorFormatDefinition

在我构建的Visual Studio扩展中,我需要在Visual Studio编辑器中突出显示方法调用.例如:

在此输入图像描述

我想使用HSV颜色根据唯一调用的数量来划分色谱.

如果我将每种颜色导出为自己的EditorFormatDefinition,我可以实现突出显示:

[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "red-background")]
[Name("red-background")]
[UserVisible(true)]
[Order(After = Priority.High)]
public sealed class RedBackground : ClassificationFormatDefinition
{
    public RedBackground()
    {
        DisplayName = "red-background";
        BackgroundColor = Colors.Red;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这需要我手动设置我想提前使用的所有颜色.有没有办法EditorFormatDefinitions在运行时导出?

IContentTypeRegistryService中的某些注册表,IClassificationTypeRegistryService允许在运行时创建新的内容类型和分类.是否存在类似的API EditorFormatDefinitions.

或者,是否可以EditorFormatDefinition在Visual Studio中动态MEF导出?

c# vspackage visual-studio visual-studio-extensions visual-studio-package

5
推荐指数
1
解决办法
325
查看次数

如何从Visual Studio 2012中永久删除扩展?

我注意到Visual Studio 2012的以下行为:我创建了VS2012 Package Project(来自SDK).当我编译并运行它时,会启动一个实验性VS实例,因此我可以测试实现的包.但是,如果我从实验VS实例(使用Tools -> Extensions and Updates -> Uninstall)卸载包,那么我尝试重新编译并重新运行包,我得到编译错误,没有输出和错误列表中显示的任何错误.因此,再次开发我的包是不可能的.每个新创建的VS2012包项目都可以重现此问题.

总之,我无法在实验VS实例中运行我的包,因为我以前卸载过它.它似乎是一个包元数据缓存问题.我该如何解决这个问题?

编辑:

重现此问题的步骤:

  1. 创建新的Visual Studio 2012包项目(必须安装VS2012 SDK).
  2. 编译并运行项目.应该启动VS实例.
  3. 在VS Experimental实例中,转到Tools -> Extensions and Updates并卸载刚刚创建的扩展.
  4. 关闭VS实验实例.
  5. 尝试再次编译和运行Package项目.应该有编译或启动错误,但输出和错误列表中没有信息.

此时,再次使用此Package Project无法运行VS Experimental实例.

visual-studio vsix visual-studio-extensions visual-studio-2012 visual-studio-package

4
推荐指数
1
解决办法
5769
查看次数

如何获取VS包项目中的DTE对象实例?

如何在VS包项目中获取DTE实例?它在插件项目中是直接的,因为application它作为参数传递给onConnection方法,但不清楚如何将它放入包中。

c# visual-studio-addins visual-studio-2012 visual-studio-package

3
推荐指数
1
解决办法
2849
查看次数

特定文件的 Visual Studio 自定义编辑器

语境:

我正在为 Visual Studio 2017 创建自定义项目模板,效果很好。在这个项目模板中,我发出一个名为“ manifest.json ”的文件。

我需要为“ manifest.json ”文件创建自定义编辑器\设计器,当用户在“解决方案资源管理器”中双击该文件时,它会打开我的自定义编辑器。

我已经在 Microsoft Doc 上找到了几篇文章(例如创建自定义编辑器和设计器),并找到了一些关于创建自定义编辑器和自定义设计器的 GitHub 示例(例如Editor_With_ToolboxSingleFileGeneratorWPFDesigner_XMLSnippet Designer)。

问题:

  • 大多数文章、示例和文档都解释了如何将自定义编辑器与特定文件扩展名相关联(在我的例子中,我想将编辑器与特定项目中的特定文件“ manifest.json ”相关联)。
  • 与单个文件生成器相关的文章,它们不适合我的解决方案,因为它们涉及在设计器中编辑文件而在解决方案中发出另一个文件(如 Windows 窗体设计器)。

概括:

我想实现仅针对我的自定义项目模板中的特定文件运行的 Visual Studio 自定义编辑器\设计器。如何实现这一目标?

笔记:

  • 要在自定义编辑器中关联的文件必须命名为“ manifest.json ”。
  • 如果其他项目类型中存在名为“ manifest.json ”的文件,则应执行标准编辑器而不是我的自定义编辑器。

visual-studio vsix visual-studio-extensions visual-studio-package

3
推荐指数
1
解决办法
840
查看次数