将Roslyn MSBuildWorkspace与Visual Studio 2013一起使用
本文关键字:2013 一起 Studio Visual Roslyn MSBuildWorkspace | 更新日期: 2023-09-27 18:26:18
对于我的硕士论文,我正在构建一个Visual Studio插件,该插件应该对当前打开的解决方案执行一些代码分析。为了做到这一点,我决定尝试使用Roslyn,使用相应的nuget包。
在我尝试使用MSBuildWorkspace.Create().
之前,一切都很好(用于导航代码的SyntaxTree,…)最后一次调用导致以下异常:
无法加载文件或程序集"Microsoft.Build,版本=14.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'或其一个依赖关系。系统找不到文件指定。":"Microsoft.Build,版本=14.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a
我发现这两个帖子:
- 正在创建新的Microsoft.CodeAnalysis.CustomWorkspace-获取ReflectionTypeLoadException
- MSBuildWorkspace.Create()引发异常
从中我了解到我需要Visual Studio 14的MSBuild Tools,它位于相关的iso中。
我不想安装完整的Visual Studio 14,这也是因为我正在编写的插件应该在Visual Studio 2013下运行。从两篇帖子来看,我似乎只能安装VS14的这一部分。
实际上,我的问题是:如果我安装MSBuild Tools for Visual Studio 14,我当前正在处理的所有其他Visual Studio项目会发生什么?目前,他们使用Visual Studio 2013的MSBuild工具。还能用吗?
更新
我实际想得到的是,找出一个给定的方法在项目中是否有引用。我们的想法是按照这篇帖子的方式进行。
当你说你正在为Visual Studio构建一个插件时,如果你只关心为当前打开的解决方案获取工作区(即用户正在编辑的代码),那么你就永远不应该使用MSBuildWorkspace。这是一种用于在Visual Studio的外部加载内容的类型。如果您在该产品中,您可以使用MEF[Import]Microsoft.VisualStudio.LanguageServicesMicrosoft.VisualStudio.Workspace。它使您能够实时访问用户打开的内容,并避免完全运行MSBuild。
请注意,您仍然需要小心选择要构建的引用程序集:如果您使用最新的NuGet包,这些包将无法工作,因为它们的版本(以及API——我们更改了很多内容)与上一次Visual Studio 2013预览版不同。
问题是(不幸的是)公共Roslyn nuget包中的程序集是使用比您想要的更新版本的MSBuild编译的。
然而,修复它非常简单,因此它可以在MSBuild4.0(VS2012+)上运行。我已经向他们提供了一份修复的PR(https://roslyn.codeplex.com/workitem/405),还发布了一个名为DesktopAnalysis的nuget包,该包包含用于进行C#代码分析的所有程序集,这些程序集可在VS2012+(MSBuild 4.0+)上运行:https://www.nuget.org/packages/DesktopAnalysis
只要做一个install-package DesktopAnalysis -pre
,你就完了。组件相同,代码相同,等等。
我正在使用它来提供一个代码迁移扩展,它可以从VS2013一直工作到VS2015预览版。
您可以派生Roslyn代码库,并使用定义的MSBUILD12进行编译,这应该仍然有效,尽管我们并没有真正测试这么多。
这是完全可能的,但一点也不容易。
您需要确保只加载目标VS版本中的Roslyn程序集版本,方法是从VSIX中删除这些程序集并处理AssemblyResolve以确保获得正确的程序集
你可以在这里看到我的代码,你可以在我的博客文章中阅读更多关于这种技术的信息
请注意,如果您需要[Export]
在Roslyn程序集中定义的任何接口,这将根本不起作用,因为MEF会在添加处理程序之前尝试加载它们。(除非您在ildasm中手动添加模块初始值设定项)
更困难的部分是,您需要将自己限制在您想要支持的每个Roslyn版本中的API的交叉点上。