web-dev-qa-db-fra.com

exécuter du code c # à l'exécution à partir du fichier de code

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?

44
Vinod Maurya

Vous pouvez utiliser Microsoft.CSharp.CSharpCodeProvider pour compiler du code à la volée. En particulier, voir CompileAssemblyFromFile .

35
jason

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);
        }
    }
}
89
acoolaum

Je recommande de consulter Microsoft Roslyn , et en particulier sa classe ScriptEngine. Voici quelques bons exemples pour commencer:

  1. Introduction à l'API Roslyn Scripting
  2. tilisation de Roslyn ScriptEngine pour un ValueConverter pour traiter l'entrée utilisateur .

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);
21
Adi Lester

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.

3
Aaron D

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.

2
Developer