我想开始在Roslyn中完成代码,但找不到任何简单的示例来说明如何完成代码.
什么是一个很好的例子来完成这个代码,以便我可以获得所有可能的完成项目(AKA智能感知或CTRL +空间完成)caretIndex?
static void Main(string[] args)
{
var code = @"
using System;
public class Test
{
public void TestMethod()
{
var now = DateTime.Now;
now.
}
}";
Console.WriteLine(code);
var st = SyntaxTree.ParseText(code);
var caretIndex = code.IndexOf("now.") + 4;
//how to get possible code completions at caret index? (Intellisense)
}
Run Code Online (Sandbox Code Playgroud) 我在roslyn的语法树中有一个ClassDeclarationSyntax.我这样看了:
var tree = SyntaxTree.ParseText(sourceCode);
var root = (CompilationUnitSyntax)tree.GetRoot();
var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>();
Run Code Online (Sandbox Code Playgroud)
标识符仅包含类的名称,但不包含有关命名空间的信息,因此缺少fullType名称.像"MyClass"但是noch"Namespace1.MyClass"
获取语法的名称空间/ FulltypeName的推荐方法是什么?
在新的Roslyn预览网站上,它提到了能够尝试潜在的语言功能,并列出了三个这样的功能.

我之前听过的前两个(例如这里),但我无法从代码示例中找出"索引成员"是什么.任何人都可以根据其他来源或代码示例解释这些是什么吗?(它没有价值$x,不是C#5中的有效标识符.)
更新 - 根据Roslyn功能状态页面,此功能已被撤消.
使用Roslyn编译为动态程序集时,我遇到了性能问题.编译花了大约3秒,相比之下,使用CodeDom编译器编译相同代码的时间约为300毫秒.这是我用来编译的代码的简化版本:
var compilation = CSharpCompilation.Create(
"UserPayRules.dll",
syntaxTrees,
assembliesToAdd);
using (var stream = new MemoryStream())
{
stopWatch.Start();
var result = compilation.Emit(stream);
stopWatch.Stop();
Debug.WriteLine("Compilation: {0}", stopWatch.ElapsedMilliseconds);
if (!result.Success)
{
throw new InvalidOperationException();
}
var assembly = Assembly.Load(stream.GetBuffer());
}
Run Code Online (Sandbox Code Playgroud)
这个答案建议将ModuleBuilder对象传递给Emit方法而不是MemoryStream,以加快速度.我试图遵循这种模式,如下:
var compilation = CSharpCompilation.Create(
"UserPayRules.dll",
syntaxTrees,
assembliesToAdd);
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("ThisAssembly"),
AssemblyBuilderAccess.RunAndCollect);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("ThisModule");
var result = compilation.Emit(moduleBuilder);
Debug.WriteLine("Compilation: {0}", stopWatch.ElapsedMilliseconds);
if (!result.Success)
{
throw new InvalidOperationException();
}
var assembly = Assembly.Load(stream.GetBuffer());
Run Code Online (Sandbox Code Playgroud)
但我的Roslyn版本显然没有超载的Emit方法需要一个ModuleBuilder …
是否有可能获得TypeInfo对象中包含的类型的完全限定名称?
在调试器中,很多这些值很好地显示为,System.Int32但是当它打印出来时,其中没有一个包含这个完全限定的名称.我需要这个作为参数Type.GetType().
var typeInfo = semanticModel.GetTypeInfo(argument);
var w = typeInfo.ToString(); // Microsoft.CodeAnalysis.TypeInfo
var y = typeInfo.Type.ToString(); // int
var z = typeInfo.Type.ToDisplayString(); // int
var a = typeInfo.Type.OriginalDefinition.ToDisplayString(); // int
var b = typeInfo.Type.OriginalDefinition.ToString(); // int
var c = typeInfo.Type.Name; // Int32
var d = typeInfo.Type.MetadataName; // Int32
var e = typeInfo.Type.ToDisplayParts(); // {int}
var f = typeInfo.Type.ContainingNamespace; // System
Run Code Online (Sandbox Code Playgroud)
请注意,这应该适用于每种类型,因此我不能只是将名称空间与名称连接起来.
或者:是否有其他(更适合?)的方式来获得确切的类型?
对于上下文:我想检查类的类型参数是否包含一些特定的方法.因此,我的方法是从每个对象TypeArgumentListSyntax获取参数并从中获取参数.TypeInfoTypeSyntax
我需要获取特定符号的完整CLR名称.这意味着,对于泛型类型,我需要的`1,`2等附加类型.现在,ISymbol已经有了一个MetadataName确实如此的财产.但是它排除了周围的类型和名称空间,只给出了手头符号的名称.
获得完全限定名称的通常选项,即通过ToDisplayString这里不太合适,因为它不会使用MetadataName它的各个部分.
有这样的内置吗?或者我是否必须在两者之间连接ContainingSymbols 链.?(这个假设是否存在分解?)
编辑:只是注意到你需要+在个别名称之间,如果它是包含在另一种类型中的类型,但除此之外,使用.应该工作,我想.
如何在VS 2015中关闭Roslyn Code Fixes?
它正常工作(使用最新的Resharper 9.1.2),但在初始化它阻止导航时,我的意思是Home,End,Left,Right延迟0.5-1.5秒.此外它似乎是傻瓜导航键,现在是我发现自己在VS主菜单中的第十次,或者只是通过按下我列出的4个导航键的其他源文件,我不知道如何...
到目前为止我尝试过的:
可能我错过了一些不会那么难的东西......
假设我列举了所有货币:
public enum CurrencyType
{
/// <summary>
/// United Arab Emirates dirham
/// </summary>
[EnumMember]
AED = 784,
/// <summary>
/// Afghan afghani
/// </summary>
[EnumMember]
AFN = 971,
/// <summary>
/// Albanian lek
/// </summary>
[EnumMember]
ALL = 008,
...
}
Run Code Online (Sandbox Code Playgroud)
VS 2015代码分析一直抱怨每个成员有100个违反CA1709的行为.
这本身就是一个有用的规则,我不想禁用它; 然而,在这个特定的情况下它并没有多大帮助,因为它CurrencyType是公共的,并且在很多其他项目中使用.
我可以压制这个消息; 然而,VS只允许我为每个成员压制它 - 这意味着我将拥有100 [SuppressMessage(...)]行,这将使代码混乱.
有没有办法抑制所有CurrencyType成员的所有CA1709 ,而不是为这个项目中的所有其他代码抑制它,而不必写100 [SuppressMessage(...)]?
有一个Scope参数SuppressMessageAttribute,但文档不清楚.我试过放两个
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope = "type", Justification = "Currency codes are defined in ISO …Run Code Online (Sandbox Code Playgroud) Haiya! I'm having an issue regarding trying to compile my .NET 5 application to a single file executable while debugging through Visual Studio.
My CSProject is bellow.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net50</TargetFramework>
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
I have my runtime identifier set to winx64 and publish single file set to true, yet when building I'm left with a bunch of DLLs that my application uses building along-side it (a total of 272 in total). I was wondering …
roslyn .net-core .net-core-publishsinglefile asp.net-core-5.0
我刚刚尝试安装Visual Studio 2015,在尝试编译旧项目时,我收到了警告
CS0675按位或运算符用于符号扩展操作数; 首先考虑转换为较小的无符号类型
对于在Visual Studio 2013中编译时没有给出相同警告的代码片段.我发现重现所需的只是这个非常简单的代码:
short a = 0;
int b = 0;
a |= (short)b;
Run Code Online (Sandbox Code Playgroud)
现在,我已经阅读了这个问题,我已经阅读了Eric Lippert关于这个问题的博文,我很快就读到了符号扩展,但我的理解是当你从一个由较小数字组成的有符号数字类型中进行转换时会发生符号扩展的位以一个与位,更大数量的诸如short以int例如.
但是因为我从一个int到另一个short,所以如果我没有弄错的话就不会发生任何符号扩展.事实上,这不会在早期版本的Visual Studio中发出警告,这让我相信这必定是Visual Studio 2015编译器(Roslyn)中的一个错误.我是否误解了符号扩展和/或编译器如何在这里工作,或者这很可能是编译器错误?
Jon Skeet指出实际上确实发生了一个符号扩展,因为|没有定义运算符short,因此int在结果short再次转换之前会有一个隐式转换.但是,编译器不应该发出此警告,因为强制转换是无害的.在接受的答案中指出,Roslyn编译器中存在一个错误.
roslyn ×10
c# ×8
.net ×1
.net-core ×1
.net-core-publishsinglefile ×1
c#-6.0 ×1
cci ×1
fxcop ×1
performance ×1