В моем пакете 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?