MSBuildWorkspace.OpenSolutionAsync 抛出异常
MSBuildWorkspace.OpenSolutionAsync throws an Exception
完整代码如下:
MSBuildWorkspace msBuild = MSBuildWorkspace.Create();
Solution sln = await msBuild.OpenSolutionAsync(solutionPath);//NullReferenceException
其中 solutionPath
是有效的 .sln Visual Studio 2015 解决方案。我尝试了一个 Winforms 新项目和一个带有简单 class 的 dll。我在尝试阅读之前关闭了该解决方案,但这没有帮助。它仍然抛出 NullReferenceException。
我正在使用 VS2015。 x64 Windows 10.
MSBuildWorkspace
是不是 Workspace
的错误类型?还缺什么吗?
(NullReferenceException 实际上是一个方法抛出的奇怪错误。这通常是 mistakenNull.DoSomething(); 之类的东西抛出的错误类型。)
编辑 2 - 此代码位于解决方案的 dll 项目中,该解决方案还包含一个调用此代码的简单 Winforms 项目。 (因为 Roslyn 项目模板创建了一个 dll 项目。)也许这很重要。
编辑 - 堆栈跟踪
异常: 对象引用未设置到对象的实例。
堆栈跟踪:
at Microsoft.CodeAnalysis.CSharp.CSharpProjectFileLoader.CSharpProjectFile.GetReferences(CSharpCompilerInputs compilerInputs, ProjectInstance executedProject, IEnumerable`1& metadataReferences, IEnumerable`1& analyzerReferences)
at Microsoft.CodeAnalysis.CSharp.CSharpProjectFileLoader.CSharpProjectFile.CreateProjectFileInfo(CSharpCompilerInputs compilerInputs, ProjectInstance executedProject)
at Microsoft.CodeAnalysis.CSharp.CSharpProjectFileLoader.CSharpProjectFile.<GetProjectFileInfoAsync>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.<LoadProjectAsync>d__40.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.<GetOrLoadProjectAsync>d__39.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.<OpenSolutionAsync>d__34.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at namespace1.RosTest.<RenameMethods>d__0.MoveNext() in C:\Users\...
您需要确保在您的申请旁边包含 Microsoft.CodeAnalysis.CSharp.Workspaces.dll
和/或 Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll
。
工作区代码动态加载它们。
我遇到了同样的问题,当我安装了正确版本的
"Microsoft.CodeAnalysis.CSharp" 从下方组装 link.
https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp/
这可能对某些人有所帮助,所以我在这里发帖。
完整代码如下:
MSBuildWorkspace msBuild = MSBuildWorkspace.Create();
Solution sln = await msBuild.OpenSolutionAsync(solutionPath);//NullReferenceException
其中 solutionPath
是有效的 .sln Visual Studio 2015 解决方案。我尝试了一个 Winforms 新项目和一个带有简单 class 的 dll。我在尝试阅读之前关闭了该解决方案,但这没有帮助。它仍然抛出 NullReferenceException。
我正在使用 VS2015。 x64 Windows 10.
MSBuildWorkspace
是不是 Workspace
的错误类型?还缺什么吗?
(NullReferenceException 实际上是一个方法抛出的奇怪错误。这通常是 mistakenNull.DoSomething(); 之类的东西抛出的错误类型。)
编辑 2 - 此代码位于解决方案的 dll 项目中,该解决方案还包含一个调用此代码的简单 Winforms 项目。 (因为 Roslyn 项目模板创建了一个 dll 项目。)也许这很重要。
编辑 - 堆栈跟踪
异常: 对象引用未设置到对象的实例。
堆栈跟踪:
at Microsoft.CodeAnalysis.CSharp.CSharpProjectFileLoader.CSharpProjectFile.GetReferences(CSharpCompilerInputs compilerInputs, ProjectInstance executedProject, IEnumerable`1& metadataReferences, IEnumerable`1& analyzerReferences)
at Microsoft.CodeAnalysis.CSharp.CSharpProjectFileLoader.CSharpProjectFile.CreateProjectFileInfo(CSharpCompilerInputs compilerInputs, ProjectInstance executedProject)
at Microsoft.CodeAnalysis.CSharp.CSharpProjectFileLoader.CSharpProjectFile.<GetProjectFileInfoAsync>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.<LoadProjectAsync>d__40.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.<GetOrLoadProjectAsync>d__39.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.<OpenSolutionAsync>d__34.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at namespace1.RosTest.<RenameMethods>d__0.MoveNext() in C:\Users\...
您需要确保在您的申请旁边包含 Microsoft.CodeAnalysis.CSharp.Workspaces.dll
和/或 Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll
。
工作区代码动态加载它们。
我遇到了同样的问题,当我安装了正确版本的 "Microsoft.CodeAnalysis.CSharp" 从下方组装 link.
https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp/
这可能对某些人有所帮助,所以我在这里发帖。