2016-11-11 12 views
1

私はリサーチグループで働いており、データ取得プログラムにスクリプト機能を追加することに専念しています。理想的には、データ収集ソフトウェアの実行中にスクリプトを作成して、そのスクリプトをファイルとして保存したいと考えています。コマンドラインも素晴らしいかもしれません。既存のC#プロジェクトにスクリプト機能を追加する

私はC#での経験はあまりありませんが、他の言語(Objective-C、Python)でかなりのコーディング経験があります。私はこのリンクhttps://blogs.msdn.microsoft.com/cdndevs/2015/12/01/adding-c-scripting-to-your-development-arsenal-part-1/を見ましたが、これは "Roselyn Scripting Package"の詳細ですが、それが私の最善の選択肢かどうかはわかりません。

誰かが完全なスクリプト機能を取得する最も簡単な方法を提案できますか? (私はここで私の人生の月を失うことを避けようとしています。 start at/adviceへのリンクは大歓迎です。

ありがとうございます!

答えて

0

私は数週間前のようなプロトタイプを作成していますが、まだ実装されていないので、興味深いリンクを投稿しました。私の目標は、Webページ上にC#の「即時の」コンソールを作成することです。

いくつかのアセンブリをプログラムによって読み込んで、明示的に参照する必要があります。

ここにコードがあります。後で解決策を投稿してください、私は知りたいと思うでしょう。

これは実行時にC#コードを記述し、String戻り値を取得することができます。

protected void getImmediateResult_Click(object sender, EventArgs e) 
    { 

     //building the code 
     string source = @"using System; 
     class MyType{ 
     public static String Evaluate(){ 
     <!expression!> 
     }}"; 

     string expression = this.txtimmediate.Text; 
     string finalSource = source.Replace("<!expression!>", expression); 
     textcodeCheck.Text = finalSource; 
     var compileUnit = new CodeSnippetCompileUnit(finalSource); 

     //preparing compilation 
     CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); 

     // Create the optional compiler parameters 

     //this correctly references the application but no System.Web etc 
     string[] refArray = new string[2]; 

     UriBuilder uri = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase); 
     refArray[0] = uri.Path; 

     //this works 
     refArray[1] = "System.Web" + ".dll"; 

     ////NOT WORKING for non microsoft assemblies 
     //var allRefs = Assembly.GetExecutingAssembly().GetReferencedAssemblies(); 
     //string[] refArray = new string[allRefs.Length + 1]; 
     //int i = 1; 
     //foreach (AssemblyName refer in allRefs) 
     //{ 
     // refArray[i] = refer.Name + ".dll"; 
     // i++; 
     //} 

     var compilerParameters = new CompilerParameters(refArray); 

     CompilerResults compilerResults = provider.CompileAssemblyFromDom(compilerParameters, compileUnit); 
     if (compilerResults.Errors.Count > 0) 
     { 
      //1st error 
      this.txtResult.Text = compilerResults.Errors[0].ErrorText; 
      return; 
     } 

     //running it 
     Type type = compilerResults.CompiledAssembly.GetType("MyType"); 
     MethodInfo method = type.GetMethod("Evaluate"); 
     String result = (String)method.Invoke(null, null); 


     this.txtResult.Text = result; 
    } 
+0

あなたは 'CodeDom'(' CodeSnippetCompileUnit'、 'CSharpCodeProviderを使用している場合'など)、あなたはそのハッキングした文字列ソースを必要としません。コードを使って定型句を構築することができます。 – Kroltan

+0

@Kroltan本当ですか?私は毎回クラスの構文を入力したくありません。 – user6788933

+1

つまり、ボイラープレートは、文字列から解析されずに置換される代わりに、コードで構築できます。この方法では、周囲の定型文ではなく、スニペットでエラーをより確実にレポートします。例(C#6を使用していますが、他のバージョンにも簡単に翻訳できます):http://pastebin.com/5w86FrVb – Kroltan

0

あなたはIronPythonのを使用するために喜んでいる場合は、C#でスクリプトを直接実行することができます。

using IronPython.Hosting; 
using Microsoft.Scripting.Hosting; 

private static void doPython() 
{ 
    ScriptEngine engine = Python.CreateEngine(); 
    engine.ExecuteFile(@"test.py"); 
} 

Get IronPython here.

関連する問題