6

特定の構成と設定に c# スクリプト ファイルを使用するアプリケーションを開発しました。スクリプト ファイルには、さまざまなユーザー生成オブジェクトと、それらのオブジェクトに対する特定の関数が含まれています。現在、ユーザーはサードパーティのエディターを使用して .cs ファイルを生成し、それを使用するためにプログラムへのパスを提供する必要があります。この方法の欠点は、スクリプト ファイルの編集中に、ユーザーがオートコンプリートやインテリセンス風のサポートを柔軟に利用できないことです。

スクリプト編集部分をアプリケーションに組み込みたい。これは、リッチテキスト エディターを使用して行うことができます。しかし、オートコンプリート部分のコーディングは非常に面倒です。オートコンプリートも行うプログラム内エディターをユーザーに提供できる方法はありますか....

プログラムでスクリプトを動的にコンパイルするためのコード。

public String Compile(String inputfilepath)
    {

        CompilerResults res = null;
        CSharpCodeProvider provider = new CSharpCodeProvider();
        String errors = "";

        if (provider != null)
        {
            try
            {
                Assembly asb = Assembly.Load("BHEL.PUMPSDAS.Datatypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=81d3de1e03a5907d"); 
                CompilerParameters options = new CompilerParameters();
                options.GenerateExecutable = false;
                options.OutputAssembly = String.Format(outFileDir + oName);
                options.GenerateInMemory = false;
                options.TreatWarningsAsErrors = false;
                options.ReferencedAssemblies.Add("System.dll");
                options.ReferencedAssemblies.Add("System.Core.dll");
                options.ReferencedAssemblies.Add("System.Xml.dll");
                options.ReferencedAssemblies.Add("System.Xml.dll");
                options.ReferencedAssemblies.Add(asb.Location);
                res = provider.CompileAssemblyFromFile(options, inputfilepath);
                errors = "";
                if (res.Errors.HasErrors)
                {
                    for (int i = 0; i < res.Errors.Count; i++)
                    {
                        errors += "\n " + i + ". " + res.Errors[i].ErrorText;
                    }
                }
            }

            catch (Exception e)
            {
                throw (new Exception("Compilation Failed with Exception!\n" + e.Message +
                    "\n Compilation errors : \n" + errors + "\n"));
            }

        }
        return errors;
    }
4

1 に答える 1

2

特にオートコンプリートの場合、パーサーとリフレクションの 2 つのシステムを利用する必要があります。

理論的には、パーサーは非常に単純な概念ですが、C# のように多くの構文糖衣と多くの文脈依存キーワードを備えた言語を作成するのは容易ではないと確信しています。

.NET は本質的にリフレクティブであり、リフレクション フレームワークを提供するため、その部分もそれほど苦痛ではありません。リフレクションを使用すると、コンパイルされたアセンブリを構成するオブジェクト指向の要素 (およびアセンブリ自体) をオブジェクトとして操作できます。Methodたとえば、メソッドはオブジェクトになります。クラスのメンバーを調べることで、このシステムを垣間見ることができますType。これは、リフレクションの基本的な開始点の 1 つです。もう 1 つの便利な出発点はAssemblyです。 MSDNには、いつものように、構造化された形式の豊富な「公式」情報があります。

于 2013-04-20T05:26:46.973 に答える