繁体   English   中英

将Roslyn MSBuildWorkspace与Visual Studio 2013一起使用

[英]Use Roslyn MSBuildWorkspace with Visual Studio 2013

对于我的硕士论文,我正在构建一个Visual Studio插件,该插件应该对当前打开的解决方案执行一些代码分析。 为了做到这一点,我决定尝试使用Roslyn,使用相应的nuget包

一切正常(SyntaxTree用于导航代码,......),直到我尝试使用MSBuildWorkspace.Create(). 最后一次调用会导致以下异常:

无法加载文件或程序集'Microsoft.Build,Version = 14.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。 系统找不到指定的文件。“:”Microsoft.Build,Version = 14.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a

我找到了这两个帖子:

据我所知,我需要Visual Studio 14的MSBuild工具,它位于相关的iso中。

我不想安装完整的Visual Studio 14,这也是因为我正在编写的插件应该在Visual Studio 2013下运行。从这两个帖子看来我似乎只能安装VS 14的这一部分。

我的问题实际上是:如果我为Visual Studio 14安装MSBuild工具,那么我目前正在处理的所有其他Visual Studio项目会发生什么? 目前他们使用Visual Studio 2013的MSBuild工具。仍然可以使用它?

更新

我实际上想要得到的是找到一个给定的方法是否在项目中有引用。 这个想法是按照这篇文章进行的

当您说您正在为Visual Studio构建插件时,如果您关心的是获取当前打开的解决方案的工作区(即用户正在编辑的代码),那么您不应该使用MSBuildWorkspace。 这是一种 Visual Studio 之外加载东西的类型。 如果您在产品中,可以执行的操作是MEF [导入] Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace。 这使您可以实时访问用户打开的内容,并避免完全运行MSBuild。

请注意,您仍然需要谨慎选择您构建的引用程序集:如果您使用的是最新的NuGet程序包,因为它们的版本不同(以及API)我们更改了一堆东西)比上一个Visual Studio 2013预览中的东西。

问题是(不幸的是)公共Roslyn nuget包中的程序集已使用比您想要的更新版本的MSBuild进行编译。

但是,修复非常简单,以便它可以在MSBuild 4.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的交集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM