0

我正在使用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 的确切字符串,所以不要建议像更改文件中的字符串这样的答案。请另一种解决方案!

4

1 回答 1

7

你误解了字符串。

@"..."字符串文字;它创建一个值为 的字符串...

因此,当您编写 时Execute(@"System.Console.WriteLine(""Hello World"");"),您传递给的实际Execute()值为System.Console.WriteLine("Hello World");

当您从文件中读取字符串时,您将获得该字符串的实际值。
StreamReader不假定文件包含 C# 字符串文字表达式(这将是非常奇怪、意外和无用的)。

因此,当您读取包含 text 的文件时@"System.Console.WriteLine(""Hello World"");",您会得到一个带有实际 value 的字符串@"System.Console.WriteLine(""Hello World"");"
(要将其写入字符串文字,您需要编写@"@""System.Console.WriteLine(""""Hello World"""");""""

然后,当您将该字符串传递给 Roslyn 的Execute()方法时,Roslyn 会计算字符串文字表达式,并返回文字的字符串值。

于 2013-03-18T16:27:50.177 回答