2012-05-18 7 views
9

In questo momento sto lavorando a un progetto e il team vuole un modo per scrivere codice e modificarlo senza dover ricompilare l'intero progetto, quindi ho deciso di provare e implementare un motore di scripting .Riferimento all'assieme corrente con CompilerParameters

Dopo aver implementato Lua in C++, non ero un principiante a implementare funzionalità di scripting nei progetti. Tuttavia, volevamo provare e implementare direttamente C# usando lo spazio dei nomi Microsoft.CSharp, combinato con System.Reflection che era già incorporato in C#.

Quindi, avendo sentito parlare di questo, ho parlato di documenti e ho trovato un prototipo che ALMOST funziona, ma non del tutto.

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

Il problema che ho in questo momento è che voglio essere in grado di fare riferimento mia interfaccia - IScript.cs (che si trova all'interno del namespace Scripting e, quindi, il gruppo corrente) - in modo che gli script scritti e analizzati nel compilatore può accedervi. Ovviamente, ho aggiunto Scripting.dll come parametro, ma non sembra che sia possibile accedervi per qualche motivo. I am eseguendolo nel debug in modo che questo potrebbe essere la causa per alcuni facepalmage importanti. Cosa fare?

C'è un modo per fare riferimento all'assieme corrente e passarlo a CompilerParameters? O sono davvero avvitato/dovrei fare affidamento sulla creazione di un assieme per gli oggetti script/etc?

+0

lo script è tutto su una riga; considera di chiamare 'AppendLine()'. (non che farà alcuna differenza) – SLaks

risposta

5

Probabilmente sta cercando nella directory sbagliata.

Passaggio typeof(Program).Assembly.CodeBase per passare il percorso completo.

0

È possibile ottenere il file eseguibile e passarlo ai CompilerParameters:

 string exeName = Assembly.GetEntryAssembly().Location;  
     param.ReferencedAssemblies.Add(exeName); 
Problemi correlati