2014-10-12 120 views
6

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

一切工作正常(SyntaxTree用于导航的代码,...),直到我试图用MSBuildWorkspace.Create(). 这最后调用导致以下异常:

无法加载文件或程序集“微软。 Build,Version = 14.0.0.0, Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其 依赖项之一。系统无法找到文件指定 “:” Microsoft.Build,版本= 14.0.0.0,文化=中立, 公钥= b03f5f7f11d50a3a

我发现这两个职位:

从中我明白,我需要的MSBuild工具的Visual Studio 14,这是在相对ated iso。

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

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

更新

什么我acctually试图得到的是找到一个给定的方法有项目中引用。这个想法是按照this post进行的。

+0

与VS集成的诊断将与VS耦合。看起来Roslyn现在需要VS 14,VS 13预览版不再受支持。您当然可以并排安装多个版本的VS,但由于它是CTP,因此总是会出现一些问题。通常的样板文件是:“尽管这些CTP旨在与早期版本的Visual Studio一起并行安装,但不保证每个CTP的完全兼容性。” – 2014-10-12 08:56:35

+0

事实上,我可以安装并排不同的VS版本(与通常的样板)它是我知道weel。事实上,最终该插件应该与Wisual Studio 2013一起工作。如果为了与VS 2013一起工作,我需要安装VS 2014的MSBuild,直到“正常VS 2013项目”仍然会使用旧的MSBuild。 – Lando 2014-10-12 11:06:42

+1

正如Jason所说,您应该使用VisualStudioWorkspace,并且您不会遇到任何这些问题。由于VisualStudioWorkspace没有记录,我在这里为各种工作区编写了一个指南:http://joshvarty.wordpress.com/2014/09/12/learn-roslyn-now-part-6-working-with-workspaces/ – JoshVarty 2014-10-12 19:45:45

回答

1

这是entirely possible,但并不容易。

您需要确保您只加载了您所针对的VS版本中的Roslyn程序集版本,方法是从VSIX中删除这些程序集并处理AssemblyResolve以确保您获得正确的版本。
你可以看到我的代码所做的正是这here,你可以在my blog post

注意阅读更多关于这项技术,如果你需要[Export]罗斯林组件定义的接口,这不会在所有的工作,因为MEF会在添加处理程序之前尝试加载它们。 (除非在ildasm中手动添加模块初始化程序)

更难的部分是,您需要将自己限制在要支持的每个Roslyn版本中的API交集处。

+0

我做鬼脸看到这个代码,并不能推荐它。连接AssemblyResolve是一种混乱的方式 - 想象如果两个扩展尝试这样做,每个尝试加载不同版本的Roslyn!我认识到他们可能在您的特定情况下不可用,但我也会在该代码中发表评论,以表明如果任何人需要绑定重定向或其他内容,他们不应该这样做并使用受支持的机制。 – 2014-10-12 19:34:12

+0

@JasonMalinowski:该代码的目的是加载VS中的Roslyn版本;加载不同版本的Roslyn是个不错的主意。我不知道任何替代我的代码,使VS2013和Dev14的单个DLL工作。 – SLaks 2014-10-12 19:37:39

+0

但是,当两个人这样做会发生什么? :-) – 2014-10-12 22:51:55

3

你可以派生Roslyn代码库,并且用MSBUILD12进行编译,但仍然可以工作,尽管我们没有真正测试过这么多。

6

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

请注意,您仍然需要小心您选择的引用程序集,以防止它们:如果使用最新的NuGet程序包将无法运行,因为它们的版本(以及API)有所不同改变了一堆东西),而不是上一次Visual Studio 2013预览中的内容。

+0

使用VisualStudioWorspace可以获得项目并调用'project.GetCompilationAsync()。Result;'? – Lando 2014-10-13 11:56:15

+1

(为了更好地理解这个问题,请参阅我正在尝试实现的ultime目标的原始问题更新。) – Lando 2014-10-13 12:04:41

+0

@Lando:不要使用'.Result';使用'await'。 (否则,你会遇到死锁和其他问题) – SLaks 2014-10-13 13:40:44

5

问题是(不幸的是)公共Roslyn nuget软件包中的程序集已经使用新版本的MSBuild编译而不是您想要的。

但是,修复它非常简单,因此它可以在MSBuild 4.0(VS2012 +)上运行。我已经为他们提供了与修复(在https://roslyn.codeplex.com/workitem/405)公关,而且还出版了NuGet包称为DesktopAnalysis包含所有组件做C#代码分析,在VS2012 +的工作(的MSBuild 4.0+):https://www.nuget.org/packages/DesktopAnalysis

只要做一个install-package DesktopAnalysis -pre而不是你完成。程序集是相同的,代码是相同的,等等。

我正在使用它来提供从VS2013一直到VS2015预览的代码迁移扩展。

相关问题