2019-06-22T12:48:26.000+09:00

VSCodeの C# エクステンション (OmniSharp) が .NET Coreプロジェクトに対しInvalidProjectFileExceptionを吐いて上手くいかない時の対処

Visual Studio Code向けC#エクステンションには、OmniSharpが含まれる。
.NET Core SDKのプロジェクトを上記環境で利用しようとした際、以下のようなエラーが表示され上手く利用できない場合がある:

...
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
        Located 2 MSBuild instance(s)
            1: Visual Studio Build Tools 2017 15.9.28307.718 - "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin"
            2: StandAlone 15.0 - "C:\Users\shuma\.vscode\extensions\ms-vscode.csharp-1.20.0\.omnisharp\1.32.20\.msbuild\Current\Bin"
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
        Registered MSBuild instance: Visual Studio Build Tools 2017 15.9.28307.718 - "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin"
...
[warn]: OmniSharp.MSBuild.ProjectManager
        Failed to load project file 'c:\Users\shuma\Documents\my-dotnet-app\MyDotnetApp.csproj'.
c:\Users\shuma\Documents\my-dotnet-app\MyDotnetApp.csproj(1,1)
Microsoft.Build.Exceptions.InvalidProjectFileException: SDK 競合回避モジュールを読み込めませんでした。マニフェスト ファイルは存在しますが、SDK 競合回避モジュール DLL ファイルへのパスが見つかりませんでした。マニフェスト ファイル パス 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\SdkResolvers\Microsoft.Build.NuGetSdkResolver\Microsoft.Build.NuGetSdkResolver.xml'。SDK 競合回避モジュール パス: C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\CommonExtensions\Microsoft\NuGet\Microsoft.Build.NuGetSdkResolver.dll  c:\Users\shuma\Documents\my-dotnet-app\MyDotnetApp.csproj
   場所 Microsoft.Build.Shared.ProjectFileErrorUtilities.VerifyThrowInvalidProjectFile(Boolean condition, String errorSubCategoryResourceName, BuildEventFileInfo projectFile, Exception innerException, String resourceName, Object[] args)
   場所 Microsoft.Build.BackEnd.SdkResolution.SdkResolverLoader.TryAddAssemblyFromManifest(String pathToManifest, String manifestFolder, List`1 assembliesList, ElementLocation location)
   場所 Microsoft.Build.BackEnd.SdkResolution.SdkResolverLoader.FindPotentialSdkResolvers(String rootFolder, ElementLocation location)
   場所 Microsoft.Build.BackEnd.SdkResolution.SdkResolverLoader.LoadResolvers(LoggingContext loggingContext, ElementLocation location)
   場所 Microsoft.Build.BackEnd.SdkResolution.SdkResolverService.Initialize(LoggingContext loggingContext, ElementLocation location)
   場所 Microsoft.Build.BackEnd.SdkResolution.SdkResolverService.ResolveSdk(Int32 submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, String solutionPath, String projectPath, Boolean interactive)
   場所 Microsoft.Build.BackEnd.SdkResolution.CachingSdkResolverService.<>c__DisplayClass3_0.<ResolveSdk>b__0(String key)
   場所 System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   場所 Microsoft.Build.BackEnd.SdkResolution.CachingSdkResolverService.ResolveSdk(Int32 submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, String solutionPath, String projectPath, Boolean interactive)
   場所 Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImportsFromUnescapedImportExpressionConditioned(String directoryOfImportingFile, ProjectImportElement importElement, List`1& projects, SdkResult& sdkResult, Boolean throwOnFileNotExistsError)
   場所 Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImports(String directoryOfImportingFile, ProjectImportElement importElement, SdkResult& sdkResult)
   場所 Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(String directoryOfImportingFile, ProjectImportElement importElement)
   場所 Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(ProjectRootElement currentProjectOrImport)
   場所 Microsoft.Build.Evaluation.Evaluator`4.Evaluate(ILoggingService loggingService, BuildEventContext buildEventContext)
   場所 Microsoft.Build.Evaluation.Project.Reevaluate(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings, EvaluationContext evaluationContext)
   場所 Microsoft.Build.Evaluation.Project.ReevaluateIfNecessary(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings, EvaluationContext evaluationContext)
   場所 Microsoft.Build.Evaluation.Project.Initialize(IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectLoadSettings loadSettings, EvaluationContext evaluationContext)
   場所 Microsoft.Build.Evaluation.Project..ctor(String projectFile, IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectCollection projectCollection, ProjectLoadSettings loadSettings, EvaluationContext evaluationContext)
   場所 Microsoft.Build.Evaluation.ProjectCollection.LoadProject(String fileName, IDictionary`2 globalProperties, String toolsVersion)
   場所 OmniSharp.MSBuild.ProjectLoader.EvaluateProjectFileCore(String filePath) 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectLoader.cs:行 129
   場所 OmniSharp.MSBuild.ProjectLoader.BuildProject(String filePath) 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectLoader.cs:行 72
   場所 OmniSharp.MSBuild.ProjectFile.ProjectFileInfo.Load(String filePath, ProjectIdInfo projectIdInfo, ProjectLoader loader) 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectFile\ProjectFileInfo.cs:行 94
   場所 OmniSharp.MSBuild.ProjectManager.LoadOrReloadProject(String projectFilePath, Func`1 loader) 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectManager.cs:行 304

[fail]: OmniSharp.MSBuild.ProjectManager
        Attempted to update project that is not loaded: c:\Users\shuma\Documents\my-dotnet-app\MyDotnetApp.csproj

あるいは、以下のようなエラーである場合もある:

...
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
        Located 2 MSBuild instance(s)
            1: Visual Studio Community 2017 15.4.27004.2002 - "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin"
            2: StandAlone 15.0 - "C:\Users\shuma\.vscode\extensions\ms-vscode.csharp-1.20.0\.omnisharp\1.32.20\.msbuild\Current\Bin"
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
        Registered MSBuild instance: Visual Studio Community 2017 15.4.27004.2002 - "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin"
...
[warn]: OmniSharp.MSBuild.ProjectManager
        Failed to load project file 'c:\Users\shuma\Documents\my-dotnet-app\my-dotnet-app.csproj'.
c:\Users\shuma\Documents\my-dotnet-app\my-dotnet-app.csproj(1,1)
Microsoft.Build.Exceptions.InvalidProjectFileException: 指定された SDK 'Microsoft.NET.Sdk' は見つかりませんでした。  c:\Users\shuma\Documents\my-dotnet-app\my-dotnet-app.csproj
   場所 Microsoft.Build.Shared.ProjectErrorUtilities.ThrowInvalidProject(String errorSubCategoryResourceName, IElementLocation elementLocation, String resourceName, Object[] args)
   場所 Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImportsFromUnescapedImportExpressionConditioned(String directoryOfImportingFile, ProjectImportElement importElement, List`1& projects, Boolean throwOnFileNotExistsError)
   場所 Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImports(String directoryOfImportingFile, ProjectImportElement importElement)
   場所 Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(String directoryOfImportingFile, ProjectImportElement importElement)
   場所 Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(ProjectRootElement currentProjectOrImport)
   場所 Microsoft.Build.Evaluation.Evaluator`4.Evaluate(ILoggingService loggingService, BuildEventContext buildEventContext)
   場所 Microsoft.Build.Evaluation.Project.Reevaluate(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings)
   場所 Microsoft.Build.Evaluation.Project.ReevaluateIfNecessary(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings)
   場所 Microsoft.Build.Evaluation.Project.Initialize(IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectLoadSettings loadSettings)
   場所 Microsoft.Build.Evaluation.Project..ctor(String projectFile, IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectCollection projectCollection, ProjectLoadSettings loadSettings)
   場所 Microsoft.Build.Evaluation.ProjectCollection.LoadProject(String fileName, IDictionary`2 globalProperties, String toolsVersion)
   場所 OmniSharp.MSBuild.ProjectLoader.EvaluateProjectFileCore(String filePath) 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectLoader.cs:行 129
   場所 OmniSharp.MSBuild.ProjectLoader.BuildProject(String filePath) 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectLoader.cs:行 72
   場所 OmniSharp.MSBuild.ProjectFile.ProjectFileInfo.Load(String filePath, ProjectIdInfo projectIdInfo, ProjectLoader loader) 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectFile\ProjectFileInfo.cs:行 94
   場所 OmniSharp.MSBuild.ProjectManager.<>c__DisplayClass30_0.<LoadProject>b__0() 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectManager.cs:行 293
   場所 OmniSharp.MSBuild.ProjectManager.LoadOrReloadProject(String projectFilePath, Func`1 loader) 場所 D:\a\1\s\src\OmniSharp.MSBuild\ProjectManager.cs:行 304

[fail]: OmniSharp.MSBuild.ProjectManager
        Attempted to update project that is not loaded: c:\Users\shuma\Documents\my-dotnet-app\my-dotnet-app.csproj

対処

Visual Studio Build Tools 2017 (Build Tools for Visual Studio 2017) をアンインストールすれば上手く動くことを確認した。
具体的には、スタートメニュー内に Visual Studio Installer という名前のアプリケーションが存在するので、これを起動し Visual Studio Build Tools 2017 という項目の記載を探す。当該項目の 詳細▼ から アンインストールOKと進めばよい。

アンインストールが完了したら、一旦VSCodeを開いていれば終了させてから再度プロジェクトを開き直すとよい。この状態で既に正常動作するようになっているはず。
もしBuildやRunが上手くいかないようなら、プロジェクト内の.vscodeディレクトリを削除して、再度プロジェクトを開き直してみる、というのを試してほしい。