我正在使用 Roslyn 在运行时执行C#代码。
首先我尝试了这段代码(工作正常):
engine.Execute(@"System.Console.WriteLine(""Hello World"");");
之后,我想从文本文件中执行代码,所以我这样做了:
string line;
System.IO.StreamReader file = new System.IO.StreamReader("test.txt");
while ((line = file.ReadLine()) != null)
{
engine.Execute(line);
}
我将以前用过的字符串复制到名为test.txt的外部文件中。
所以我的test.txt包含以下行:@"System.Console.Write(""Hello World"");"
当编译代码我收到错误时会遗漏某些内容。
所以我发现,这只是反斜杠。
并将代码更改为:
string line;
System.IO.StreamReader file = new System.IO.StreamReader("test.txt");
while ((line = file.ReadLine()) != null)
{
string toto = line;
string titi = toto.Replace(@"\\", @"");
engine.Execute(toto);
}
现在,当我运行此代码时,没有任何反应(没有错误)。
当我检查变量内容时,我得到了这个:
toto : "@\"System.Console.Write(\"\"Hello World\"\");\""
titi : "@\"System.Console.Write(\"\"Hello World\"\");\""
这是正常的!通常应删除baskslash,但事实并非如此。
问题是什么
EDIT
我想保留我在代码中传递给Roslyn的确切字符串,因此不建议更改文件中的字符串等答案。请另外解决方案!
答案 0 :(得分:7)
你误解了字符串。
@"..."
是一个字符串文字;它会创建一个值为...
的字符串。
因此,当您撰写Execute(@"System.Console.WriteLine(""Hello World"");")
时,您传递给Execute()
的实际值为System.Console.WriteLine("Hello World");
当您从文件中读取字符串时,您将获得字符串的实际值
StreamReader
不认为该文件包含C#字符串文字表达式(这将非常奇怪,出乎意料,无用)。
因此,当您阅读包含文本@"System.Console.WriteLine(""Hello World"");"
的文件时,会得到一个包含实际值@"System.Console.WriteLine(""Hello World"");"
的字符串。
(要在字符串文字中写这个,你需要写@"@""System.Console.WriteLine(""""Hello World"""");""""
)
然后,当您将该字符串传递给Roslyn的Execute()
方法时,Roslyn会计算字符串文字表达式,并返回字面值的字符串值。