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?
lo script è tutto su una riga; considera di chiamare 'AppendLine()'. (non che farà alcuna differenza) – SLaks