2013-03-18 86 views
0

我正在使用Roslyn在運行時執行C#代碼。使用Roslyn從外部文件執行代碼

首先我想這個代碼(正常工作):

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"");"

當compliling代碼我得到一個錯誤少了東西。

所以我想通了,它只是反斜槓。

,並改變了代碼如下:

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\"\");\""

這是正常的!通常情況下,應該刪除斜槓,但情況並非如此。

什麼問題

EDIT

我要保持我過時了以羅斯林代碼完全匹配的字符串,所以不建議樣改變答案文件中的字符串。另請解決!

+0

試着把這段代碼放在文件中:'System.Console.Write(「Hello World」);',沒有別的。應該工作正常。 – 2013-03-18 16:26:23

+0

你是什麼意思?我從來沒有聽說過! – 2013-03-18 16:26:53

+0

您不需要在文件中轉義字符串。 StreamReader爲您做到了這一點。只需輸入它就像我編輯的評論。 – 2013-03-18 16:27:45

回答

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"""");""""

然後,當您傳遞字符串羅斯林的Execute()方法,羅斯林評估字符串常量表達式,並返回文本的字符串值。