выполнить код C # во время выполнения из файла кода - PullRequest
44 голосов
/ 15 ноября 2010

У меня есть приложение WPF C # , содержащее кнопку.

Код нажатия кнопки написан в отдельном текстовом файле, который будет помещен в каталог времени выполнения приложений.

Я хочу выполнить этот код, помещенный в текстовый файл при нажатии кнопки.

Есть идеи, как это сделать?

Ответы [ 5 ]

85 голосов
/ 15 ноября 2010

Пример кода для выполнения метода скомпилированного на лету класса:

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);
        }
    }
}
35 голосов
/ 15 ноября 2010

Вы можете использовать Microsoft.CSharp.CSharpCodeProvider для компиляции кода на лету.В частности, см. CompileAssemblyFromFile .

21 голосов
/ 10 ноября 2012

Я рекомендую взглянуть на Microsoft Roslyn , в частности на его класс ScriptEngine.Вот несколько хороших примеров для начала:

  1. Введение в API сценариев Roslyn
  2. Использование Roslyn ScriptEngine для ValueConverter для обработки ввода пользователя.

Пример использования:

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);
3 голосов
/ 05 февраля 2014

Похоже, кто-то создал библиотеку для этого с именем C # Eval .

РЕДАКТИРОВАТЬ: Обновлена ​​ссылка, указывающая на Archive.org, поскольку кажется, что оригинальный сайт мертв.

2 голосов
/ 10 апреля 2014

Вам нужен CSharpCodeProvider Class

Есть несколько примеров, чтобы понять, как это работает.

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

Важным моментом этого примера является то, что на самом деле вы можете делать все на flay.

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

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

Этот пример хорош тем, что вы можете создать файл DLL, и поэтому он может бытьиспользуется другими приложениями.

В основном вы можете искать http://www.codeproject.com/search.aspx?q=csharpcodeprovider&x=0&y=0&sbo=kw&pgnum=6 и получать более полезные ссылки.

...