2011-07-09 17 views
4

私はXNAのRPGスタイルのゲームで作業しています。私はスクリプトエンジンの実装に取り​​組んでいます。XNA C#Scripting with CSharpCodeProvider

私はいくつかのチュートリアルに従ってこれを試してみました。私は成功したプロジェクトに、私は次のコードでそれをコンパイルしようとすることを取得した後

namespace MyGame 
{ 
    public class EngagedCode : ScriptingInterface.IScriptType1 
    { 
    public string RunScript() 
    { 
     ChangeFrame(2); 
    } 
    } 
} 

:現在、私は、XMLファイルから次に読ま

Microsoft.CSharp.CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider(); 

CompilerParameters options = new CompilerParameters(); 
options.GenerateExecutable = false; //DLL 
options.GenerateInMemory = true; 
options.IncludeDebugInformation = true; 

options.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location); 

CompilerResults result = csProvider.CompileAssemblyFromSource(options, code); 

しかし、この時点で私は常に次のエラーを取得する:

'result.CompiledAssembly' threw an exception of type 'System.IO.FileNotFoundException' 

システムは、私がコンパイルした.dllファイルを見つけることができない、と私はなぜ知らないかのように思え。私はこのエラーを回避する方法を知らない。誰か提案はありますか?

答えて

4

コンパイル・エラーがない限り、それはまだ、ディスクへの.dllを書き込み、その後、あなたはこの役に立たないSystem.IOを取得します。 FileNotFoundException。コンパイルエラーが発生している可能性が最も高いです。

これらのコンパイルエラーを取り除くには、以下を追加する必要があります。

CompilerResults results = csProvider.CompileAssemblyFromSource(parameters, textBox1.Text); 

if (results.Errors.Count > 0) 
{ 
    foreach (CompilerError CompErr in results.Errors) 
    { 
     //Hooray a list of compile errors 
    } 
    else 
    { 
     //Successful Compile 
    } 
} 

また、このすべてをスキップしたい場合。 this classをご覧ください。メソッド本体を使用するだけで、これでは十分ではないかもしれません。また、const CodeStart文字列の名前空間を変更する必要があります。

+2

+1良い点はコンパイルエラーをキャッチすることです:) –

1

次の行は必要ありません:あなたはメモリにそれを生成する場合であっても

options.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);