使用 CSharpSyntaxTree.ParseText 时如何编码双引号 (Roslyn)
How to encode doube quotes when using CSharpSyntaxTree.ParseText (Roslyn)
我正在尝试使用 Roslyn 编译器动态生成程序集 & class。
当我调用 Emit 时,我得到以下关于基本构造函数中双引号值的错误:
我应该如何对传递给 ParseText
的字符串中的双引号进行编码?
var syntaxTree = CSharpSyntaxTree.ParseText(@"using System;
using System.Linq;
using Xxx.Operators;
namespace Xxx.Operators
{
public sealed class DuplicateOperator : Operator
{
public DuplicateOperator() : base(\""Sub\"")
{
}
public override long Execute(params Func<long>[] operands)
{
var firstValue = operands.First()() * 2;
return operands.Aggregate(firstValue, (a, b) => a - b());
}
}
}");
在下面的代码中调用 Emit 时会产生错误,如果我将上面的引号 (Sub) 替换为 String.Empty 之类的东西,那么 Emit 就会成功。
var references = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic)
.Select(a => a.Location)
.Distinct()
.Select(l => MetadataReference.CreateFromFile(l))
.ToArray();
var compilation = CSharpCompilation.Create("Xxx.DynamicOperator", new []{syntaxTree}, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
using var ms = new MemoryStream();
var result = compilation.Emit(ms);
if (result.Success)
{
ms.Seek(0, SeekOrigin.Begin);
Assembly assembly = Assembly.Load(ms.ToArray());
}
双引号用于表示verbatim string中的双引号:
Only a quote escape sequence (""
) is not interpreted literally; it produces one double quotation mark
所以你应该删除 \
:
@"
....
public DuplicateOperator() : base(""Sub"")
...
"
我正在尝试使用 Roslyn 编译器动态生成程序集 & class。
当我调用 Emit 时,我得到以下关于基本构造函数中双引号值的错误:
我应该如何对传递给 ParseText
的字符串中的双引号进行编码?
var syntaxTree = CSharpSyntaxTree.ParseText(@"using System;
using System.Linq;
using Xxx.Operators;
namespace Xxx.Operators
{
public sealed class DuplicateOperator : Operator
{
public DuplicateOperator() : base(\""Sub\"")
{
}
public override long Execute(params Func<long>[] operands)
{
var firstValue = operands.First()() * 2;
return operands.Aggregate(firstValue, (a, b) => a - b());
}
}
}");
在下面的代码中调用 Emit 时会产生错误,如果我将上面的引号 (Sub) 替换为 String.Empty 之类的东西,那么 Emit 就会成功。
var references = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic)
.Select(a => a.Location)
.Distinct()
.Select(l => MetadataReference.CreateFromFile(l))
.ToArray();
var compilation = CSharpCompilation.Create("Xxx.DynamicOperator", new []{syntaxTree}, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
using var ms = new MemoryStream();
var result = compilation.Emit(ms);
if (result.Success)
{
ms.Seek(0, SeekOrigin.Begin);
Assembly assembly = Assembly.Load(ms.ToArray());
}
双引号用于表示verbatim string中的双引号:
Only a quote escape sequence (
""
) is not interpreted literally; it produces one double quotation mark
所以你应该删除 \
:
@"
....
public DuplicateOperator() : base(""Sub"")
...
"