使用Roslyn从外部文件执行代码

时间:2013-03-18 16:25:32

标签: c# regex roslyn

我正在使用 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的确切字符串,因此不建议更改文件中的字符串等答案。请另外解决方案!

1 个答案:

答案 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会计算字符串文字表达式,并返回字面值的字符串值。