簡體   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