Visual studio 2015 从VSIX命令调用Roslyn

Visual studio 2015 从VSIX命令调用Roslyn,visual-studio-2015,roslyn,vsix,vsx,visual-studio-package,Visual Studio 2015,Roslyn,Vsix,Vsx,Visual Studio Package,从EnvDTE.ProjectItem获取Roslyn的语法树的最佳方法是什么?我找到了另一种方法(将Roslyn的文档转换为ProjectItem) 我从打开的文档中调用了VSIX命令,我想在这里试用Roslyn的语法树 此代码有效,但在我看来很尴尬: var pi = GetProjectItem(); var piName = pi.get_FileNames(1); var componentModel = (IComponentModel)Microsoft.

从EnvDTE.ProjectItem获取Roslyn的语法树的最佳方法是什么?我找到了另一种方法(将Roslyn的文档转换为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))
var pi=GetProjectItem();
var piName=pi.get_文件名(1);
var componentModel=(icomonentmodel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(scocomponentmodel));
var workspace=componentModel.GetService();
var id=workspace.getOpenDocumentId();
var id1=ids.First(id=>workspace.GetFilePath(id)==piName);
Microsoft.CodeAnalysis.Solution sln=workspace.CurrentSolution;
var doc=sln.GetDocument(id1);
//var w=wait doc.GetSyntaxTreeAsync();
Microsoft.CodeAnalysis.SyntaxTree SyntaxTree;
if(文档TryGetSyntaxTree(外部syntaxTree))

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

如果您能够了解如何从
项目项
获取编辑器
ITextSnapshot
,那么最好使用
snapshot.AsText().GetOpenDocumentInCurrentContextWithChanges()


还请注意,在上面的代码中,通过使用
TryGetSyntaxTree
您依赖于其他人在您之前请求了解析树。

您可以使用workspace.CurrentSolution.GetDocumentIdsWithFilePath()获取与文件路径匹配的DocumentId。从中,您可以使用workspace.CurrentSolution.GetDocument()获取文档本身

私有文档GetActiveDocument()
{
var dte=Package.GetGlobalService(typeof(dte))作为dte;
var activeDocument=dte?.activeDocument;
if(activeDocument==null)返回null;
var componentModel=(IComponentModel)Package.GetGlobalService(typeof(scocomponentmodel));
var workspace=(workspace)componentModel.GetService();
var documentid=workspace.CurrentSolution.GetDocumentIdsWithFilePath(activeDocument.FullName).FirstOrDefault();
if(documentid==null)返回null;
返回workspace.CurrentSolution.GetDocument(documentid);
}

弗兰克的回答很有效。我发现很难弄清楚类型名是什么,因此下面是Frank的代码,其中包含完全限定的类型名:

using System.Linq;

var dte = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
var activeDocument = dte?.ActiveDocument;
if (activeDocument != null)
{
    var componentModel = (Microsoft.VisualStudio.ComponentModelHost.IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.ComponentModelHost.SComponentModel));
    var workspace = (Microsoft.CodeAnalysis.Workspace)componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>();
    var documentId = workspace.CurrentSolution.GetDocumentIdsWithFilePath(activeDocument.FullName).FirstOrDefault();
    if (documentId != null)
    {
        var document = workspace.CurrentSolution.GetDocument(documentId);
    }
}
使用System.Linq;
var dte=Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(EnvDTE.dte))作为EnvDTE.dte;
var activeDocument=dte?.activeDocument;
如果(activeDocument!=null)
{
var componentModel=(Microsoft.VisualStudio.ComponentModelHost.IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.ComponentModelHost.scocomponentmodel));
var workspace=(Microsoft.codealysis.workspace)componentModel.GetService();
var documentId=workspace.CurrentSolution.GetDocumentIdsWithFilePath(activeDocument.FullName).FirstOrDefault();
if(documentId!=null)
{
var document=workspace.CurrentSolution.GetDocument(documentId);
}
}
以下是查找这些类型的参考:

  • 努吉:
  • 努吉:
  • 努吉:
  • 框架:EnvDTE(版本8.0,并将嵌入互操作类型设置为false)
  • 框架:Microsoft.VisualStudio.ComponentModelHost

我希望这两个框架引用可以替换为对和的NuGet引用,但是当我尝试时,它给出了关于程序集版本不匹配的生成警告,所以我放弃了。

AsText扩展方法看起来非常有用。不幸的是,我还没有找到一个方法来获取那个ITextSnapshot。有什么线索吗?在
.FirstOrDefault()中找到了这个
不会在活动上下文中为您提供文档(在多目标项目或共享项目的情况下)不会在活动上下文中为您提供文档(在多目标项目或共享项目的情况下)。
using System.Linq;

var dte = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
var activeDocument = dte?.ActiveDocument;
if (activeDocument != null)
{
    var componentModel = (Microsoft.VisualStudio.ComponentModelHost.IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.ComponentModelHost.SComponentModel));
    var workspace = (Microsoft.CodeAnalysis.Workspace)componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>();
    var documentId = workspace.CurrentSolution.GetDocumentIdsWithFilePath(activeDocument.FullName).FirstOrDefault();
    if (documentId != null)
    {
        var document = workspace.CurrentSolution.GetDocument(documentId);
    }
}