Ответ 1
Вы можете использовать Microsoft.CSharp.CSharpCodeProvider
для компиляции кода на лету. В частности, см. CompileAssemblyFromFile.
У меня есть приложение WPF С#, содержащее кнопку.
Код нажатия кнопки записывается в отдельный текстовый файл, который будет помещен в каталог выполнения приложений.
Я хочу выполнить этот код, помещенный в текстовый файл нажатием кнопки.
Любая идея, как это сделать?
Вы можете использовать Microsoft.CSharp.CSharpCodeProvider
для компиляции кода на лету. В частности, см. CompileAssemblyFromFile.
Пример кода для выполнения скомпилированного метода класса fly:
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);
}
}
}
Я рекомендую посмотреть Microsoft Roslyn и, в частности, класс ScriptEngine
.
Вот несколько хороших примеров для начала:
Пример использования:
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);
Похоже, кто-то создал библиотеку для этого С# Eval
Вам нужен класс CSharpCodeProvider
Есть несколько примеров, чтобы понять, как это работает.
1 http://www.codeproject.com/Articles/12499/Run-Time-Code-Generation-I-Compile-C-Code-using-Mi
Важным моментом этого примера является то, что вы можете делать все на самом деле.
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 и получать более полезные ссылки.