4

C# を使用して実行時に C# コードをコンパイルできることは知っています。しかし、数分前に読んだばかりなので、とても動揺しています。私は例によってよりよく学びます。だから教えて。次のようなものをコンパイルしたい場合:

// MapScript.CS
String[] LevelMap = {
"WWWWWWWWWWWWWWWWWWW",
"WGGGGGGGGGGGGGGGGGW",
"WGGGGGGGGGGGGGGGGGW",
"WWWWWWWWWWWWWWWWWWW" };

この配列をコードで使用するには、どうすればよいでしょうか?

擬似コードでは、次のようなことをしたい:

Open("MapScript.CS");
String[] levelMap = CompileArray("levelMap");
// use the array
4

3 に答える 3

6

LINQ 式ツリーは、おそらくこれを行うための最も使いやすい方法です。おそらく次のようなものです。

OpCodes ( OpCodes.Newarr )を使用して IL を生成することもできます。スタックベースのプログラミングに慣れている場合は簡単です (そうでない場合は、難しい場合があります)。

最後に、CodeDom (疑似コードが似ています) を使用できますが、これは最も強力なツールですが、迅速な動的メソッドにはあまり適していません。コンパイラと緊密に連携しているため、ファイル システムのアクセス許可と手動の参照解決が必要です。

MSDN のサンプル

var ca1 = new CodeArrayCreateExpression("System.Int32", 10);                        
var cv1 = new CodeVariableDeclarationStatement("System.Int32[]", "x", ca1);

ソース - Code DOM を使用した配列の作成

文字列をそのまま生でコンパイルしたい場合は、ステートメントのオブジェクト指向処理を省略して、代わりに大きな文字列を構築することができます。何かのようなもの:

var csc = new CSharpCodeProvider( new Dictionary<string, string>() { { "CompilerVersion", "v4.0" } } );
var cp = new CompilerParameters() {
    GenerateExecutable = false,
    OutputAssembly = outputAssemblyName,
    GenerateInMemory = true
};

cp.ReferencedAssemblies.Add( "mscorlib.dll" );
cp.ReferencedAssemblies.Add( "System.dll" );
cp.ReferencedAssemblies.Add( "System.Core.dll" );

StringBuilder sb = new StringBuilder();

// The string can contain any valid c# code, but remember to resolve your references

sb.Append( "namespace Foo{" );
sb.Append( "using System;" );
sb.Append( "public static class MyClass{");

// your specific scenario
sb.Append( @"public static readonly string[] LevelMap = {
    ""WWWWWWWWWWWWWWWWWWW"",
    ""WGGGGGGGGGGGGGGGGGW"",
    ""WGGGGGGGGGGGGGGGGGW"",
    ""WWWWWWWWWWWWWWWWWWW"" };" );

sb.Append( "}}" );

// "results" will usually contain very detailed error messages
var results = csc.CompileAssemblyFromSource( cp, sb.ToString() );
于 2012-07-31T21:00:03.627 に答える
2

テキスト(C#)ファイル内の文字列のリストを文字列配列変数にロードするためにC#コードをコンパイルしようとしているようです。

文字列のリストをテキストファイルからメモリ内の配列にロードするためにac#コンパイラは必要ありません。テキストファイルの1行に1つの文字列を入力し、コード内のファイルを1行ずつ読み取り、各行をに追加しますList<String>。完了list.ToArray()すると、文字列の配列が生成されます。

于 2012-07-31T21:02:33.107 に答える
0

タイプの静的プロパティLevelを提案するILevelCompiledLevelから継承するクラスを作成できます。String[]

次に、コンパイルする前に、 LevelMap(wwwggg ...)(一種の連結)のコンテンツで満たされたクラスのテンプレートから構築された偽のCompiledLevel.csファイルを作成します。

コンパイルされたクラスの1つのコンパイル済み呼び出しLevelプロパティ。

サービス/ファクトリ/何でもそれを派手にするために作成してください:)

于 2012-07-31T21:00:51.793 に答える