2013-04-20 12 views
7

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

スクリプト編集部分を自分のアプリケーションに埋め込んでいます。私はリッチテキストエディタを使ってそれを行うことができます。しかし、自動完成品のコーディングは大きな苦痛です。どのような方法で私は、オートコンプリートを行うプログラム内エディタをユーザに提供することができますか?

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

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; 
    } 
+0

ルア、Pythonまたはpowerscript?どのスクリプト言語を使用していますか? – David

+1

C#自体は私のスクリプト言語です。私はCodeDom名前空間を使用して、私のプログラム内からその場でC#スクリプトファイルをコンパイルしています。 –

+0

ああ私の神! C#はあなたのスクリプトですか?本気ですか? – David

答えて

2

特に自動完了の場合、パーサーとリフレクションの2つのシステムを使用する必要があります。

パーサは理論的にはかなり単純な概念ですが、構文砂糖を多く、C#と同じように多くの文脈依存キーワードを持つ言語を書くのは簡単ではないと確信しています。

.NETは本質的に反射性で反射フレームワークを提供するので、その部分も信じられないほど痛いものではありません。リフレクションでは、コンパイルされたアセンブリ(およびアセンブリ自体)を含むオブジェクト指向の要素をオブジェクトとして操作できます。メソッドは、例えばMethodオブジェクトです。リフレクションの基本的な出発点の1つを提供するTypeクラスのメンバーを調べることで、このシステムを覗くことができます。もう一つの有用な出発点はAssemblyです。 MSDNは、いつものように、構造化された形式で豊富な「正式な」情報を持っています。

+0

あなたのメソッドは、すでにコンパイルされたシステムで動作します。私が欲しいのは、コードがコンパイルされる前でも動作するVisual StudioスタイルのIntellisenseです。 –

+0

これは本質的に、あなたが行くにつれてそれをコンパイルしていることを意味します。同じ考え。あなたはまだ反射を使用することができます。枠組みが整っている。あなたは基本的にオブジェクト指向のシェルをコンパイルしています。ローカル変数のために何かカスタムを行う必要がありますが、それはただの要素です。 – Zenexer

関連する問題