Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Visual Studio 2013中使用Roslyn MSBuildWorkspace_C#_Roslyn - Fatal编程技术网

C# 在Visual Studio 2013中使用Roslyn MSBuildWorkspace

C# 在Visual Studio 2013中使用Roslyn MSBuildWorkspace,c#,roslyn,C#,Roslyn,在我的硕士论文中,我正在构建一个VisualStudio插件,它应该对当前打开的解决方案执行一些代码分析。 为了做到这一点,我决定尝试使用Roslyn,使用 在我尝试使用MSBuildWorkspace.Create()。 最后一次调用导致以下异常: 无法加载文件或程序集“Microsoft.Build,版本=14.0.0.0”, 区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'或其 依赖关系。系统找不到该文件 已指定。“:”Microsoft.Build,版本=1

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

在我尝试使用
MSBuildWorkspace.Create()。
最后一次调用导致以下异常:

无法加载文件或程序集“Microsoft.Build,版本=14.0.0.0”, 区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'或其 依赖关系。系统找不到该文件 已指定。“:”Microsoft.Build,版本=14.0.0.0,区域性=中性, PublicKeyToken=b03f5f7f11d50a3a

我发现这两个帖子:

从中我了解到我需要Visual Studio 14的MSBuild工具,它位于相关的iso中

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

我的问题实际上是:如果我为VisualStudio14安装MSBuild工具,那么我当前正在处理的所有其他VisualStudio项目会发生什么? 目前,他们正在使用Visual Studio 2013的MSBuild工具。还有可能继续使用它吗

更新

我实际上想得到的是,找到一个给定的方法在项目中是否有引用。想法是按照中的步骤进行。

这是,但一点也不容易

您需要确保只加载目标VS版本中的Roslyn程序集版本,方法是从VSIX中删除这些程序集并处理AssemblyResolve以确保获得正确的程序集。
您可以看到我的代码正是这样做的,您可以在

请注意,如果需要
[Export]
Roslyn程序集中定义的任何接口,这将根本不起作用,因为MEF将在添加处理程序之前尝试加载它们。(除非在ildasm中手动添加模块初始值设定项)


更困难的是,您需要将自己限制在希望支持的每个Roslyn版本中API的交叉处。

您可以使用Roslyn代码库,并使用定义的MSBUILD12进行编译,这应该仍然有效,尽管我们并没有进行太多测试。

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

请注意,在选择构建所依据的引用程序集时,您仍然需要小心:如果您使用最新的NuGet软件包,这些软件包将无法工作,因为它们的版本(以及API——我们更改了很多内容)与上一次Visual Studio 2013预览中的版本不同。

问题在于(不幸的是)公共Roslyn nuget包中的程序集已使用比所需版本更新的MSBuild编译

但是,修复它非常简单,因此它可以在MSBuild 4.0(VS2012+)上工作。我已经为他们提供了一个带有修复程序(at)的PR,但还发布了一个名为DesktopAnalysis的nuget包,其中包含所有用于执行C#代码分析的程序集,这些程序集在VS2012+(MSBuild 4.0+)上工作:

只需执行一个
安装包DesktopAnalysis-pre
,您就完成了。程序集相同,代码相同,等等


我用它来提供一个代码迁移扩展,可以从VS2013一直运行到VS2015预览。

与VS集成的诊断将与VS耦合。看起来Roslyn现在需要VS 14,而VS 13预览不再受支持。您当然可以并行安装多个版本的VS,但因为它是CTP,所以总是会出现一些问题。通常的样板:“虽然这些CTP打算与早期版本的Visual Studio一起安装,但不能保证每个CTP的完全兼容性。”我可以同时安装不同的VS版本(使用通常的样板),这一点我是知道的。事实上,该插件最终应该与Wisual Studio 2013配合使用。如果为了使用VS 2013,我需要安装VS 2014的MSBuild,在“正常VS 2013项目”仍将使用旧的MSBuild之前,这不是问题。正如Jason所说,您应该使用VisualStudioWorkspace,并且不会出现任何这些问题。由于VisualStudioWorkspace没有文档记录,因此我在这里编写了各种工作区的指南:看到这些代码,我会做鬼脸,不能推荐。挂接AssemblyResolve是一种混乱的方式——想象一下,如果两个扩展尝试这样做,每个扩展都尝试加载不同版本的Roslyn!我知道它们在您的特定情况下可能不可用,但我也会在代码中添加一条注释,指出如果任何人需要绑定重定向或其他东西,他们不应该这样做并使用受支持的机制。@JasonMalinowski:该代码的要点是在VS中加载Roslyn的版本;加载不同版本的Roslyn是个坏主意。我不知道除了我的代码之外,还有什么其他方法可以让单个DLL与VS2013和Dev14一起工作。但是当两个人这样做时会发生什么呢?:-)@JasonMalinowski:它会很好地工作;它们都将加载重定向到当前的VS版本。除非你的Assembly.load获取了某个人放入绑定路径的本地副本。但我想你已经破产了。在任何情况下,我们都应该添加绑定重定向,这样您就不必这样做。。。