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#文字列リテラル式が含まれているとは想定していません(これは非常に奇妙で、予期せず、役に立たないでしょう)。

したがって、テキストを含むファイルを読み取る@"System.Console.WriteLine(""Hello World"");"と、実際の値を含む文字列が取得されます@"System.Console.WriteLine(""Hello World"");"
(これを文字列リテラルで書き込むには、次のように記述する必要があります@"@""System.Console.WriteLine(""""Hello World"""");""""

次に、その文字列をRoslynのメソッドに渡すとExecute()、Roslynは文字列リテラル式を評価し、リテラルの文字列値を返します。

于 2013-03-18T16:27:50.177 に答える