我如何在网站项目中使用Roslyn?

问题描述 投票:2回答:1

在我的Visual Studio程序包中,我得到了Josh Varty所述的VisualStudioWorkspace。https://joshvarty.com/2014/09/12/learn-roslyn-now-part-6-working-with-workspaces/

[使用EnvDTE.Project对象,通过比较属性CodeAnalysis.Project.FilePath和EnvDTE.Project.FileName,在VisualStudioWorkspace.Projects中寻找匹配的Roslyn项目。

如果找到匹配项,那么我知道该项目支持Roslyn,并且可以在CodeAnalysis.Project.Documents集合中找到文档。到目前为止,这对于C#和VB项目来说都可以正常工作。

如果找不到匹配项,则可能是C ++项目,不支持Roslyn。

但是,我现在发现WebSite项目的行为完全不同。

我在Visual Studio 2019中创建了一个新的WebSite项目。解决方案仅包含一个项目,VisualStudioWorkspace包含两个CodeAnalysis.Project对象,如下所示:

?VSWorkspace.CurrentSolution.Projects(0)
1_Default.aspx
    AdditionalDocumentIds: Count = 0
    AdditionalDocuments: {System.Linq.Enumerable.WhereSelectEnumerableIterator(Of Microsoft.CodeAnalysis.DocumentId, Microsoft.CodeAnalysis.TextDocument)}
    AllProjectReferences: Length = 1
    AnalyzerConfigDocuments: {System.Linq.Enumerable.WhereSelectEnumerableIterator(Of System.Collections.Generic.KeyValuePair(Of Microsoft.CodeAnalysis.DocumentId, Microsoft.CodeAnalysis.AnalyzerConfigDocumentState), Microsoft.CodeAnalysis.AnalyzerConfigDocument)}
    AnalyzerOptions: {Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions}
    AnalyzerReferences: Length = 0
    AssemblyName: "1_Default"
    CompilationOptions: {Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions}
    DefaultNamespace: ""
    DocumentIds: Count = 2
    Documents: {System.Linq.Enumerable.WhereSelectEnumerableIterator(Of Microsoft.CodeAnalysis.DocumentId, Microsoft.CodeAnalysis.Document)}
    FilePath: Nothing
    HasDocuments: True
    Id: (ProjectId, #ca6b1f58-967a-4c31-a874-71d7720dd972 - 1_Default.aspx)
    IsSubmission: False
    Language: "C#"
    LanguageServices: {Microsoft.CodeAnalysis.Host.Mef.MefLanguageServices}
    MetadataReferences: Length = 56
    Name: "1_Default.aspx"
    OutputFilePath: Nothing
    OutputRefFilePath: Nothing
    ParseOptions: {Microsoft.CodeAnalysis.CSharp.CSharpParseOptions}
    ProjectReferences: {System.Linq.Enumerable.WhereEnumerableIterator(Of Microsoft.CodeAnalysis.ProjectReference)}
    Solution: {Microsoft.CodeAnalysis.Solution}
    SupportsCompilation: True
    Version: {2019-10-13T06:46:42.2691386Z-10141-0}
?VSWorkspace.CurrentSolution.Projects(1)
2_App_Code
    AdditionalDocumentIds: Count = 0
    AdditionalDocuments: {System.Linq.Enumerable.WhereSelectEnumerableIterator(Of Microsoft.CodeAnalysis.DocumentId, Microsoft.CodeAnalysis.TextDocument)}
    AllProjectReferences: Length = 0
    AnalyzerConfigDocuments: {System.Linq.Enumerable.WhereSelectEnumerableIterator(Of System.Collections.Generic.KeyValuePair(Of Microsoft.CodeAnalysis.DocumentId, Microsoft.CodeAnalysis.AnalyzerConfigDocumentState), Microsoft.CodeAnalysis.AnalyzerConfigDocument)}
    AnalyzerOptions: {Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions}
    AnalyzerReferences: Length = 0
    AssemblyName: "App_Code.yy7qumxk"
    CompilationOptions: {Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions}
    DefaultNamespace: ""
    DocumentIds: Count = 5
    Documents: {System.Linq.Enumerable.WhereSelectEnumerableIterator(Of Microsoft.CodeAnalysis.DocumentId, Microsoft.CodeAnalysis.Document)}
    FilePath: Nothing
    HasDocuments: True
    Id: (ProjectId, #12ab68ac-7b29-4252-87c2-67dc2f3d0696 - 2_App_Code)
    IsSubmission: False
    Language: "C#"
    LanguageServices: {Microsoft.CodeAnalysis.Host.Mef.MefLanguageServices}
    MetadataReferences: Length = 53
    Name: "2_App_Code"
    OutputFilePath: Nothing
    OutputRefFilePath: Nothing
    ParseOptions: {Microsoft.CodeAnalysis.CSharp.CSharpParseOptions}
    ProjectReferences: {System.Linq.Enumerable.WhereEnumerableIterator(Of Microsoft.CodeAnalysis.ProjectReference)}
    Solution: {Microsoft.CodeAnalysis.Solution}
    SupportsCompilation: True
    Version: {2019-10-13T06:46:41.6118955Z-10139-2}

首先,两个项目中的FilePath属性均为null,因此我无法通过其文件名来识别该项目。

这两个项目总共包含七个文档,它们是:

"C:\DotNetTestPrograms\2019\CS\WebSite1\Default.aspx.cs"
"C:\DotNetTestPrograms\2019\CS\WebSite1\Default.aspx"

"C:\DotNetTestPrograms\2019\CS\WebSite1\App_Code\BundleConfig.cs"
"C:\DotNetTestPrograms\2019\CS\WebSite1\App_Code\IdentityModels.cs"
"C:\DotNetTestPrograms\2019\CS\WebSite1\App_Code\RouteConfig.cs"
"C:\DotNetTestPrograms\2019\CS\WebSite1\App_Code\Startup.Auth.cs"
"C:\DotNetTestPrograms\2019\CS\WebSite1\App_Code\Startup.cs"

这不是项目中文档的完整列表。该项目在文件后面包含七个附加代码:

Account\Login.apsx.cs
Account\Manage.apsx.cs
Account\OpenAuthProviders.ascx.cs
Account\Register.apsx.cs
Account\RegisterExternalLogin.apsx.cs
Site.master.cs
ViewSwitcher.ascx.cs

我的问题是,我可以在WebSite项目中使用Roslyn吗?

很明显,EnvDTE和CodeAnalysis项目之间没有一对一的关系。我想我可以解决这个问题。

但是丢失的文件呢?没有七个附加代码隐藏文件的罗斯林文档吗?

roslyn visual-studio-extensions
1个回答
0
投票

我终于再次查看了这个问题,并且找到了以下解决方案。

仅当在Visual Studio中打开文档时,此方法才有效。因此,我从

开始
projectItem.Open ( EnvDTE.Constants.vsViewKindTextView ) ;

(我的功能中已经有了项目项,所以很容易。)

然后,使用文件的完整路径(FullPath)和VisualStudioWorkspace(VSWorkspace),可以使用以下方法获得Roslyn文档:>

var docid = VSWorkspace.CurrentSolution.GetDocumentIdsWithFilePath(FullPath).FirstOrDefault() ;
if ( docid != null )
{
  var RoslynDoc = VSWorkspace.CurrentSolution.GetDocument ( docid ) ;
}

如果文档尚未打开,则最好在完成后再次将其关闭。您可以使用

确定以前是否打开过该文档。
var wasOpen = projectItem.IsOpen ( EnvDTE.Constants.vsViewKindTextView ) ;

顺便说一句,像这样打开文档不会使该窗口在Visual Studio中可见(在我的应用程序中可以)。如果要使其可见,可以这样打开它:

var wnd = projectItem.Open ( EnvDTE.Constants.vsViewKindTextView ) ;
wnd.Visible = true ;
© www.soinside.com 2019 - 2024. All rights reserved.