J'ai une application WPF C # qui contient un bouton.
Le code du clic sur le bouton est écrit dans un fichier texte séparé qui sera placé dans le répertoire d'exécution des applications.
Je veux exécuter ce code placé dans le fichier texte au clic du bouton.
Une idée de comment faire ça?
Vous pouvez utiliser Microsoft.CSharp.CSharpCodeProvider
pour compiler du code à la volée. En particulier, voir CompileAssemblyFromFile .
Exemple de code pour l'exécution de la méthode de classe compilée à la volée:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Net;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string source =
@"
namespace Foo
{
public class Bar
{
public void SayHello()
{
System.Console.WriteLine(""Hello World"");
}
}
}
";
Dictionary<string, string> providerOptions = new Dictionary<string, string>
{
{"CompilerVersion", "v3.5"}
};
CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
CompilerParameters compilerParams = new CompilerParameters
{GenerateInMemory = true,
GenerateExecutable = false};
CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);
if (results.Errors.Count != 0)
throw new Exception("Mission failed!");
object o = results.CompiledAssembly.CreateInstance("Foo.Bar");
MethodInfo mi = o.GetType().GetMethod("SayHello");
mi.Invoke(o, null);
}
}
}
Je recommande de consulter Microsoft Roslyn , et en particulier sa classe ScriptEngine
. Voici quelques bons exemples pour commencer:
Exemple d'utilisation:
var session = Session.Create();
var engine = new ScriptEngine();
engine.Execute("using System;", session);
engine.Execute("double Sin(double d) { return Math.Sin(d); }", session);
engine.Execute("MessageBox.Show(Sin(1.0));", session);
On dirait que quelqu'un a créé une bibliothèque pour cela appelée C # Eval .
EDIT: lien mis à jour pour pointer vers Archive.org car il semble que le site d'origine soit mort.
Ce dont vous avez besoin est un CSharpCodeProvider Class
Il existe plusieurs exemples pour comprendre comment cela fonctionne.
1 http://www.codeproject.com/Articles/12499/Run-Time-Code-Generation-I-Compile-C-Code-using-Mi
Le point important de cet exemple est que vous pouvez tout faire sur flay en fait.
myCompilerParameters.GenerateExecutable = false;
myCompilerParameters.GenerateInMemory = false;
2 http://www.codeproject.com/Articles/10324/Compiling-code-during-runtime
Cet exemple est bon car vous pouvez créer un fichier dll et il peut donc être partagé entre d'autres applications.
Fondamentalement, vous pouvez rechercher http://www.codeproject.com/search.aspx?q=csharpcodeprovider&x=0&y=0&sbo=kw&pgnum=6 et obtenir des liens plus utiles.