如何编码双引号时使用CSharpSyntaxTree.ParseText (Roslyn)



我正在尝试使用Roslyn编译器来动态生成程序集& &;类。

当我调用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的值,则会生成错误。空则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());
}

双双引号用于表示逐字字符串中的双引号:

只有引号转义序列("")不按字面解释;它产生一个双引号

所以你应该删除:

@"
....
public DuplicateOperator() : base(""Sub"")
...
"

相关内容

  • 没有找到相关文章

最新更新