#c# #verbatim-string
Вопрос:
Я пытаюсь использовать компилятор 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 в следующем коде, если я заменю значение qoted (Sub) выше чем-то вроде строки.Пустой, тогда выброс будет успешным.
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());
}
Комментарии:
1. Или
"The quote " in normal string"
или@"The quote "" in verbatim string"
. Ваш вопрос не имеет отношения к Рослин. Это просто проблема синтаксиса C#.
Ответ №1:
Двойные двойные кавычки используются для представления двойной кавычки в дословной строке:
Только escape-последовательность кавычек (
""
) не интерпретируется буквально; она создает одну двойную кавычку
Поэтому вам следует просто удалить
:
@"
....
public DuplicateOperator() : base(""Sub"")
...
"