我正在尝试在Visual Studio 2015 CTP中使用C#6.0的新功能,而我的项目无法在TFS 2013和Visual Studio Online中构建.
我知道Visual Studio使用新的Roslyn编译器,它取代了原生的.NET编译器,因此TFS构建代理无法编译.
我的问题是如何在构建代理上(以及在Visual Studio Online中)安装Roslyn并告诉构建代理使用此编译器而不是本机?
我想尝试一下潜在的C#7未来语言功能.
我有一个虚拟机,我已经下载了Roslyn代码库(功能/模式分支),并按照Roslyn的github上的描述构建:在Windows上构建和测试.
我可以成功启动一个新的Visual Studio实验实例(将VisualStudioSetup设置为启动项目并运行).
当我尝试新的语言功能(模式匹配和本地函数)时,我在编辑器中出现错误,当我构建时出现错误和错误:
错误CS8058功能"本地功能"是实验性的,不受支持; 使用'/ features:localFunctions'来启用.
错误CS8058功能'模式匹配'是实验性的,不受支持; 使用'/ features:patterns'启用.
我在哪里提出这些选择?
我尝试将它添加到命令行参数,但我收到一个错误.
我开始使用C#Interactive,就像我可以浏览和探索一些API功能,就像我一样,Immediate无需运行和调试我的程序.
问题是,除非我使用变量名执行命令,否则它不会像立即那样输出信息:
> string.Format("{0,15}", 10m); //hit enter, here there is no output
> var a = string.Format("{0,15}", 10m); //hit enter so...
> a // hit enter and...
" 10" //...here the value is shown
>
Run Code Online (Sandbox Code Playgroud)
有没有办法C# Interactive在每个评估中输出值,就像Immediate那样(并且没有为此编写更多代码Console.Write)?
c# read-eval-print-loop roslyn visual-studio-2015 c#-interactive
据我所知,RyuJIT比JIT更快.但它是.NET 4.6的新标准还是Roslyn?
或者,当您需要在编译过程中公开API时,是否使用了Roslyn?
我对他们的目的和他们将要找到的框架感到困惑.有人可以解释这些差异,当你想要一个超过另一个时,请?
在这个问题中,当提到编译器时,我实际上指的是Roslyn编译器.使用IntelliSense时出现问题,IntelliSense被认为是相同的编译器.
出于演示目的和完整性,使用以下类(使用Visual Studio 2015与C#6.0和.NET 4.6.1):
public class A
{
public IEnumerable<B> B { get; set; }
}
public class B
{
public IEnumerable<C> C { get; set; }
}
public class C { }
public class Helper<T> { }
Run Code Online (Sandbox Code Playgroud)
请看以下扩展方法:
public static void FooBar<T1, T2>(
this Helper<IEnumerable<T1>> helper,
Expression<Func<T1, IEnumerable<T2>>> expression) { ... }
Run Code Online (Sandbox Code Playgroud)
编译器能够在消耗时推断它,如下所示:
Helper<IEnumerable<B>> helper = ...;
helper.FooBar(l => l.C); //T1 is B and T2 is C
Run Code Online (Sandbox Code Playgroud)
还有这个重载的扩展方法:
public static …Run Code Online (Sandbox Code Playgroud) 我一直致力于使用Roslyn的工作空间API来加载项目的VS Code扩展,此时扩展project.json通过包中的ProjectJsonWorkspace类型支持.NET Core的旧格式Microsoft.DotNet.ProjectModel.Workspaces.
随着新的工具更改即将发布,我很想支持新的.csproj构建格式,但似乎无法找到支持它的.NET Standard兼容工作区.
我的理解是,因为它正在使用MSBuild,我将需要使用MSBuild(Microsoft.CodeAnalysis.MSBuild)包,但此时它不支持.NET Standard.
如果存在,或者我是否必须考虑创建自己的工作区实现,最佳解决方案是什么?
我有一个名为'test.cs'的.cs文件,它基本上是这样的:
namespace test
{
public class TestClass
{
public void Hello()
{
var x = 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图用Roslyn解析这个并得到x的类型,它应该是'int',但我只能发现它是'var'类型,我似乎无法获得实际的底层类型.
这基本上就是我现在的代码
var location = "test.cs";
var sourceTree = CSharpSyntaxTree.ParseFile(location);
var root = (CompilationUnitSyntax)sourceTree.GetRoot();
foreach (var member in root.Members)
{
//...get to a method
var method = (MethodDeclarationSyntax())member;
foreach (var child in method.Body.ChildNodes())
{
if (child is LocalDeclarationStatementSyntax)
{
//var x = 1;
child.Type.RealType()?
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到真正的孩子?我已经看到一些事情说我应该使用SemanticModel或Solution或Workspace,但我似乎无法找到如何使用Roslyn加载我的测试解决方案然后获得'x'的类型.
此外,我还没有找到任何非常好的Roslyn文档,它似乎都散布在一堆不同的版本中,对于像我这样的初学者来说没什么.有没有人知道我可以阅读的"Roslyn简介"或类似的快速入门?
我有Visual Studio 2013.我也安装了MSBuild Tools 2013.以下代码给了我例外
var workspace=MSBuildWorkspace.Create();
Run Code Online (Sandbox Code Playgroud)
这是例外
无法加载文件或程序集'Microsoft.Build,Version = 14.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.该系统找不到指定的文件.
我究竟做错了什么 ?
我正在尝试使用Roslyn来确定项目公开的API(然后使用这些信息做一些进一步的处理,所以我不能只使用反射).我正在使用SyntaxWalker访问声明语法节点,并为每个节点调用IModel.GetDeclaredSymbol.这似乎适用于方法,属性和类型,但它似乎不适用于字段.我的问题是,如何为FieldDeclarationSyntax节点获取FieldSymbol?
这是我正在使用的代码:
public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
{
var model = this._compilation.GetSemanticModel(node.SyntaxTree);
var symbol = model.GetDeclaredSymbol(node);
if (symbol != null
&& symbol.CanBeReferencedByName
// this is my own helper: it just traverses the publ
&& symbol.IsExternallyPublic())
{
this._gatherer.RegisterPublicDeclaration(node, symbol);
}
base.VisitFieldDeclaration(node);
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个类库项目并进行了一些处理,并使用Roslyn生成代码.
我在WPF GUI应用程序中使用该库作为参考.
这些是NuGet包:
Build显示没有错误,但是当我使用以下代码时:
private static void GetGenerator()
{
workspace = new AdhocWorkspace();
generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp);
}
Run Code Online (Sandbox Code Playgroud)
我得到一个例外:
"不支持语言'C#'."
at: Microsoft.CodeAnalysis.Host.HostWorkspaceServices.GetLanguageServices(String languageName)
at: Microsoft.CodeAnalysis.Host.Mef.MefWorkspaceServices.GetLanguageServices(String languageName)
at: Microsoft.CodeAnalysis.Editing.SyntaxGenerator.GetGenerator(Workspace workspace, String language)
Run Code Online (Sandbox Code Playgroud)
根据这个和这个,我必须在本地复制CodeAnalysis文件并添加必要的引用.他们在那里,但错误发生.
这仍然是去年没有修复的错误吗?
我还该怎么办?