2012-05-18 8 views
9

現在、私はプロジェクトに取り組んでおり、プロジェクト全体を再コンパイルせずにコードを書いて編集する方法が必要なので、スクリプトエンジンを試してみることにしました。CompilerParametersで現在のアセンブリを参照する

以前はLuaをC++に実装していたので、私はスクリプト機能をプロジェクトに実装する初心者ではありませんでした。しかし、Microsoft.CSharp名前空間とC#に既に組み込まれているSystem.Reflectionを組み合わせてストレートC#を実装しようと思っていました。

私はこのことについて聞いたことがあるので、私はドキュメントで覗いてみましたが、私はALMOSTが動作するプロトタイプを考え出しましたが、それほどではありません。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.CSharp; 
using System.CodeDom.Compiler; 
using System.Reflection; 

namespace Scripting 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StringBuilder builder = new StringBuilder(); 
      builder.Append("using System;"); 
      builder.Append("using Scripting;"); 
      builder.Append("class MyScript : IScript"); 
      builder.Append("{"); 
      builder.Append(" string ScriptName"); 
      builder.Append(" {"); 
      builder.Append("  get { return \"My Script\"; }"); 
      builder.Append(" }"); 

      builder.Append(" public bool Initialize()"); 
      builder.Append(" {"); 
      builder.Append("  Console.WriteLine(\"Hello, World!\");"); 
      builder.Append("  return true;"); 
      builder.Append(" }"); 
      builder.Append("}"); 

      CSharpCodeProvider provider = new CSharpCodeProvider(); 
      CompilerParameters param = new CompilerParameters(new string[] { "System.dll", "Scripting.dll" }); 
      param.GenerateInMemory = true; 
      param.GenerateExecutable = true; 
      CompilerResults result = provider.CompileAssemblyFromSource(param, builder.ToString()); 
      if (result.Errors.Count > 0) 
      { 
       foreach (CompilerError error in result.Errors) 
        Console.WriteLine(error); 
       Console.ReadKey(); 
       return; 
      } 
     } 
    } 
} 

私が現時点で持っている問題は、私は私のインターフェイスを参照できるようにしたいということです - (スクリプトの名前空間、したがって、現在のアセンブリ内にある)IScript.cs - スクリプトが書かれ、解析されたように、コンパイラの中でそれにアクセスすることができます。明らかに、私はパラメータとしてScripting.dllを追加しましたが、何らかの理由でアクセスすることができないようです。私はですこれはデバッグでそれを実行するので、これはいくつかの主要なfacepalmageの原因となる可能性があります。何ですか?

現在のアセンブリを参照してCompilerParametersに渡す方法はありますか?それとも、私は/スクリプトオブジェクトのアセンブリを作成することに依存する必要があります/私は嫌にねじれですか?

+0

あなたのスクリプトはすべて1行です。 'AppendLine()'を呼び出すことを検討してください。 (それは何の違いもありません) – SLaks

答えて

5

おそらく間違ったディレクトリにあります。

typeof(Program).Assembly.CodeBaseにフルパスを渡します。

0

あなたは、実行可能ファイルを取得し、CompilerParametersにそれを渡すことができます:

 string exeName = Assembly.GetEntryAssembly().Location;  
     param.ReferencedAssemblies.Add(exeName); 
関連する問題