对于我的硕士论文,我正在构建一个Visual Studio插件,该插件应该对当前打开的解决方案执行一些代码分析。 为了做到这一点,我决定使用corresponding nuget package来尝试使用Roslyn。
一切正常(SyntaxTree用于导航代码,......),直到我尝试使用MSBuildWorkspace.Create().
最后一次调用会导致以下异常:
无法加载文件或程序集'Microsoft.Build,Version = 14.0.0.0, Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其中一个 依赖。系统找不到该文件 指定。“:”Microsoft.Build,Version = 14.0.0.0,Culture = neutral, 公钥= b03f5f7f11d50a3a
我找到了这两个帖子:
从中我了解到我需要Visual Studio 14的MSBuild工具,它位于相关的iso中。
我不想安装完整的Visual Studio 14,这也是因为我正在编写的插件应该在Visual Studio 2013下运行。从这两个帖子看来,我似乎只能安装VS 14的这一部分。 / p>
我的问题实际上是:如果我为Visual Studio 14安装MSBuild工具,那么我目前正在处理的所有其他Visual Studio项目会发生什么? 目前他们使用的是Visual Studio 2013的MSBuild工具。仍然可以使用它吗?
更新
我实际上想要得到的是找出一个给定的方法是否在项目中有引用。我的想法就像在this post中那样继续。
答案 0 :(得分:6)
当您说您正在为Visual Studio构建插件时,如果您关心的是获取当前打开的解决方案的工作区(即用户正在编辑的代码),那么您不应该使用MSBuildWorkspace ,真的。这是一种用于加载Visual Studio外部的的类型。如果您在产品中,您可以执行的操作是MEF [导入] Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace。这使您可以实时访问用户打开的内容,并避免完全运行MSBuild。
请注意,您仍然需要谨慎选择您构建的参考程序集:如果您使用的是最新的NuGet程序包,那么这些程序包的版本会有所不同(以及API) - 我们改变了一堆东西),而不是上一次Visual Studio 2013预览版。
答案 1 :(得分:5)
问题是(不幸的是)公共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 Preview的代码迁移扩展。
答案 2 :(得分:3)
您可以分叉Roslyn代码库,并使用定义的MSBUILD12进行编译,这仍然有效,尽管我们并没有真正测试过这么多。
答案 3 :(得分:1)
这是entirely possible,但一点也不容易。
您需要确保只加载您正在定位的VS版本中的Roslyn程序集版本,方法是从VSIX中删除这些程序集并处理AssemblyResolve以确保获得正确的程序集。
您可以看到我的代码完全符合here,您可以在my blog post
请注意,如果您需要[Export]
在Roslyn程序集中定义的任何接口,这根本不起作用,因为MEF会在您添加处理程序之前尝试加载它们。 (除非你在ildasm中手动添加模块初始化程序)
更难的部分是,您需要将自己限制在要支持的每个Roslyn版本中的API的交集。