我正在使用CSharpCompilation该类来编译SyntaxTree根是类声明的位置.我向构造函数传递一个CSharpCompilationOptions包含我的using语句的对象.
我的理解是语法树将使用我传递的任何using语句的上下文进行编译.但是当试图访问一个'usings'中定义的类时,我传递给options对象,我得到一个错误,说它在当前上下文中不存在.
我显然做错了什么.有人知道传递给CSharpCompilationOptions班级时的使用清单是什么?
这是代码:
public static void TestMethod()
{
string source = @"public class Test
{
public static void TestMethod()
{
string str = Directory.GetCurrentDirectory();
}
}";
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source);
List<string> usings = new List<string>()
{
"System.IO", "System"
};
List<MetadataFileReference> references = new List<MetadataFileReference>()
{
new MetadataFileReference(typeof(object).Assembly.Location),
};
//adding the usings this way also produces the same error
CompilationUnitSyntax root = (CompilationUnitSyntax)syntaxTree.GetRoot();
root = root.AddUsings(usings.Select(u => SyntaxFactory.UsingDirective(SyntaxFactory.IdentifierName(u))).ToArray());
syntaxTree = CSharpSyntaxTree.Create(root);
CSharpCompilationOptions …Run Code Online (Sandbox Code Playgroud) 我有以下两个模型和DbContext:
public class TestDbContext : DbContext
{
public IDbSet<Person> People { get; set; }
public IDbSet<Car> Cars { get; set; }
}
public class Person
{
public Person()
{
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string Name { get; set; }
public virtual List<Car> Cars { get; set; }
}
public class Car
{
public Car()
{
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string Name { get; set; …Run Code Online (Sandbox Code Playgroud) c# orm entity-framework relational-database entity-framework-5
如果我创建两个int文字的二进制添加表达式(addExpression),如下所示:
BinaryExpressionSyntax addExpression = SyntaxFactory.BinaryExpression(SyntaxKind.AddExpression,
SyntaxFactory.LiteralExpression
(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(10)),
SyntaxFactory.LiteralExpression
(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(100)));
Run Code Online (Sandbox Code Playgroud)
..然后是二进制乘法表达式,其中left是addExpression,right是int literal
BinaryExpressionSyntax multExpression = SyntaxFactory.BinaryExpression(SyntaxKind.MultiplyExpression,
addExpression,
SyntaxFactory.LiteralExpression
(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(5)));
Run Code Online (Sandbox Code Playgroud)
呼叫multExpression.ToString()输出10+100*5.我希望它输出(10+100)*5.
这是正确的行为吗?
我使用roslyn Formatter.Format()方法格式化一些c#.
其中一个参数采用Workspace可以使用的对象创建MSBuildWorkspace.Create().
但是,当我运行代码时,我得到一个运行时异常,因为工作区返回时没有支持的语言.如果我在控制台应用程序中运行它,它工作正常.
有任何想法吗?
有没有办法创建SyntaxToken或SyntaxNode更改FullSpan属性?
由于所有类都是密封的,不可变的并且没有可访问的构造函数,因此创建一个类的唯一方法是使用SyntaxFactory静态方法,这些方法没有重载来指定位置.
我正在编写一个解析为Roslyn的脚本语言SyntaxTree.当使用访问者模式检查表达式的语义时,我希望能够通过将节点映射到某个位置来告诉用户错误发生的位置.
反正呢?提前致谢.
谁能说出这个Syntax类的命名空间?
我已经通过nuget安装了所有roslyn包,但我不知道用于创建表达式语法对象的静态工厂方法的名称空间.
Web上的许多Roslyn示例都使用这些命名空间
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;
Run Code Online (Sandbox Code Playgroud)
现在这些已经过时了吗?我使用以下内容
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这个区别吗?