我正在创建一个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
事件被触发,并且调试显示代码按预期执行.但是,上下文菜单项没有变化,它保留原始文本.
我在这里错过了什么?为什么不更新?
从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的文档?
我有一个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 object
而dynamic
不是Project
- 因为这个代码已经变得不可维护了.
c# visual-studio visual-studio-extensions visual-studio-package
在我构建的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
我注意到Visual Studio 2012的以下行为:我创建了VS2012 Package Project(来自SDK).当我编译并运行它时,会启动一个实验性VS实例,因此我可以测试实现的包.但是,如果我从实验VS实例(使用Tools -> Extensions and Updates -> Uninstall
)卸载包,那么我尝试重新编译并重新运行包,我得到编译错误,没有输出和错误列表中显示的任何错误.因此,再次开发我的包是不可能的.每个新创建的VS2012包项目都可以重现此问题.
总之,我无法在实验VS实例中运行我的包,因为我以前卸载过它.它似乎是一个包元数据缓存问题.我该如何解决这个问题?
编辑:
重现此问题的步骤:
Tools -> Extensions and Updates
并卸载刚刚创建的扩展.此时,再次使用此Package Project无法运行VS Experimental实例.
visual-studio vsix visual-studio-extensions visual-studio-2012 visual-studio-package
如何在VS包项目中获取DTE实例?它在插件项目中是直接的,因为application
它作为参数传递给onConnection
方法,但不清楚如何将它放入包中。
c# visual-studio-addins visual-studio-2012 visual-studio-package
我正在为 Visual Studio 2017 创建自定义项目模板,效果很好。在这个项目模板中,我发出一个名为“ manifest.json ”的文件。
我需要为“ manifest.json ”文件创建自定义编辑器\设计器,当用户在“解决方案资源管理器”中双击该文件时,它会打开我的自定义编辑器。
我已经在 Microsoft Doc 上找到了几篇文章(例如创建自定义编辑器和设计器),并找到了一些关于创建自定义编辑器和自定义设计器的 GitHub 示例(例如Editor_With_Toolbox、SingleFileGenerator、WPFDesigner_XML和Snippet Designer)。
我想实现仅针对我的自定义项目模板中的特定文件运行的 Visual Studio 自定义编辑器\设计器。如何实现这一目标?
visual-studio vsix visual-studio-extensions visual-studio-package