2014-10-12 117 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預覽的代碼遷移擴展。

相關問題