Как я могу использовать Roslyn с сайтом проекта? - PullRequest
2 голосов
/ 13 октября 2019

В моем пакете Visual Studio я получаю VisualStudioWorkspace, как описано Джошем Варти https://joshvarty.com/2014/09/12/learn-roslyn-now-part-6-working-with-workspaces/

Используя объект EnvDTE.Project, я ищу соответствующий проект Roslyn в VisualStudioWorkspace.Projects, сравнивая свойства CodeAnalysis. Project.FilePath и EnvDTE.Project.FileName.

Если я найду совпадение, то я знаю, что проект поддерживает Roslyn и что я могу найти документы в коллекции CodeAnalysis.Project.Documents. До сих пор это работало нормально для проектов C # и VB.

Если я не нахожу совпадение, то это может быть проект C ++, который не поддерживает Roslyn.

Однако я имеюТеперь выяснилось, что проекты WebSite ведут себя совершенно иначе.

Я создал новый проект WebSite в Visual Studio 2019. Несмотря на то, что решение содержит только один проект, 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

Мой вопрос: могу ли я работать с Roslyn в проекте WebSite?

Очевидно, что нетотношения один-к-одному между проектами EnvDTE и CodeAnalysis. Я думаю, что я мог бы обойти это.

Но как насчет отсутствующих файлов? Разве нет документов Roslyn для семи дополнительных файлов code-behind?

...