wykonaj kod c# w czasie wykonywania z pliku kodu

Mam WPF C# aplikację, która zawiera przycisk.

Kod kliknięcia przycisku jest zapisany w osobnym pliku tekstowym, który zostanie umieszczony w katalogu runtime aplikacji.

Chcę wykonaj ten kod umieszczony w pliku tekstowym po kliknięciu przycisku.

Jakiś pomysł jak to zrobić?

Author: Academy of Programmer, 2010-11-15

5 answers

Możesz użyć Microsoft.CSharp.CSharpCodeProvider Aby skompilować kod w locie. W szczególności patrz CompileAssemblyFromFile.

 34
Author: jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-15 05:41:01

Próbka kodu do wykonania metody compiled on fly class:

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);
        }
    }
}
 79
Author: acoolaum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-15 06:15:08

Polecam przyjrzeć się Microsoft Roslyn , a konkretnie jego klasie ScriptEngine. Oto kilka dobrych przykładów na początek:

  1. Wprowadzenie do API skryptów Roslyn
  2. użycie Roslyn ScriptEngine dla ValueConverter do przetwarzania danych wejściowych użytkownika .

Przykład użycia:

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
Author: Adi Lester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-17 13:56:25

Wygląda na to, że ktoś stworzył do tego bibliotekę o nazwie C # Eval .

EDIT: Updated link to point to Archive.org wygląda na to, że oryginalna strona jest martwa.

 3
Author: Aaron D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-05 20:51:10

Potrzebujesz klasy CSharpCodeProvider

Istnieje kilka próbek, aby zrozumieć, jak to działa.

1 http://www.codeproject.com/Articles/12499/Run-Time-Code-Generation-I-Compile-C-Code-using-Mi

Ważny punkt tego przykładu, że można zrobić wszystko na flay w rzeczywistości.

myCompilerParameters.GenerateExecutable = false;
myCompilerParameters.GenerateInMemory = false;

2 http://www.codeproject.com/Articles/10324/Compiling-code-during-runtime

Ten przykład jest dobry, ponieważ można utworzyć dll plik, a więc może być współdzielony między innymi aplikacjami.

W zasadzie możesz wyszukać http://www.codeproject.com/search.aspx?q=csharpcodeprovider&x=0&y=0&sbo=kw&pgnum=6 i uzyskać więcej przydatnych linków.

 2
Author: Academy of Programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-10 18:30:44