0

C# を使用して WPF でデスクトップ アプリケーションを開発しています。

簡単にするために、私のアプリケーションには、その方向に線を引く関数があると仮定しますgoleft() , goright() , goforward() , goback() .

これらの関数のいずれかが呼び出されると、1 インチの線が画面に描画されます。

ユーザーが任意のエディター (メモ帳など) でファイルにコードを記述し、そのファイルを固定形式 (.abc または .xyz など) で保存するアプリケーションを作成したい

架空の例:

   (section_start)

   For(int i = 0 ; i<= 20 ; i++ ) 
    {
      if(i<5)
      goforward();

      else if(i==5)   
       goleft();

      else if(i < 10)
       forward();
        .......
        ........
    }

    (section_End)

このファイルを読み込んで (section_start) と (section_End) の間に書かれたコードを実行できるアプリケーションを作成できますか? 可能な場合にのみ、構文エラーもチェックできます...(必須ではありません)。

この問題について教えてください:

開示:私の実際のアプリケーションは多少異なり、私の会社の規則のためにここで議論することはできませんでした.

私の質問に答えてくれたすべての人に感謝します。Stackoverflow は素晴らしいサイトです。行き先のロードマップを見つけました。今日の朝まで手がかりがありませんでしたが、今では先に進むことができます。ありがとうございました。どこかで行き詰まったら、もう一度質問します。

4

5 に答える 5

2

FileInfoを使用してファイルの内容を読み取り、実行する必要があるコードを取得できます。

次に、この投稿のようにCSharpCodeProviderを使用してコードを実行できます。

using (Microsoft.CSharp.CSharpCodeProvider foo = 
       new Microsoft.CSharp.CSharpCodeProvider())
{
var res = foo.CompileAssemblyFromSource(
    new System.CodeDom.Compiler.CompilerParameters() 
    {  
        GenerateInMemory = true 
    }, 
    "public class FooClass { public string Execute() { return \"output!\";}}"
);

var type = res.CompiledAssembly.GetType("FooClass");

var obj = Activator.CreateInstance(type);

var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
}
于 2012-07-20T09:32:00.410 に答える
0

IronPython を使用してスクリプトを処理できます。

これを行う方法の例を次に示します。

まず、操作を実行するためのナビゲーション オブジェクトが必要です。

public class NavigationObject
{
    public int Offset { get; private set; }

    public void GoForwards()
    {
        Offset++;
    }

    public void GoBackwards()
    {
        Offset--;
    }
}

次に、ファイルを実行するコード:

public void RunNavigationScript(string filePath, NavigationObject navObject)
{
    var engine = Python.CreateEngine();
    var scope = engine.CreateScope();

    scope.SetVariable("navigation", navObject);
    var source = engine.CreateScriptSourceFromFile(filePath);
    try
    {
        source.Execute(scope);
    }
    catch(Exception
    {
    }
}

スクリプト ファイルは、次のような形式を取ることができます。

for x in range(0,20):
    if x == 5:
        navigation.GoBackwards()
    else:
        navigation.GoForwards()
于 2012-07-20T09:50:35.700 に答える
0

CodeDOM または IL Emit を選択できます

CodeDOM に関するその他のヘルプ

IL Generator / Emit の詳細

于 2012-07-20T09:31:45.387 に答える
0

私が正しく理解している場合、これはアプリケーションのスクリプト作成と呼ばれます。C# は、そのままではこれをサポートしていません。検討すべきことの 1 つは、Microsoft の新しい Roselyn コンパイラです (これは、これを可能にする C# コンパイラの新しい解釈です)。

Roselyn の詳細については、http://blogs.msdn.com/b/csharpfaq/archive/2011/12/02/introduction-to-the-roslyn-scripting-api.aspx をご覧ください

私はそれのデモを見ただけですが、非常に有望に見え、あなたの問題を解決するはずです.

于 2012-07-20T09:27:06.660 に答える
0

コンパイルするコードの種類は明確ではありませんが、C# でコード コードをコンパイルする方法についてのガイドを次に示します。

于 2012-07-20T09:27:42.630 に答える