eseguire il codice c # in runtime dal file di codice

Ho un’applicazione C # WPF che contiene un pulsante.

Il codice del clic del pulsante è scritto in un file di testo separato che verrà inserito nella directory runtime dell’applicazione.

Voglio eseguire quel codice inserito nel file di testo sul clic del pulsante.

Qualche idea su come fare questo?

È ansible utilizzare Microsoft.CSharp.CSharpCodeProvider per compilare il codice al volo. In particolare, vedi CompileAssemblyFromFile .

Esempio di codice per l’esecuzione del metodo compilato sulla class di volo:

 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 providerOptions = new Dictionary { {"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); } } } 

Consiglio di dare un’occhiata a Microsoft Roslyn e in particolare alla sua class ScriptEngine . Ecco alcuni buoni esempi per iniziare:

  1. Introduzione all’API di Roslyn Scripting
  2. Utilizzo di Roslyn ScriptEngine per un ValueConverter per elaborare l’input dell’utente .

Esempio di utilizzo:

 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); 

Sembra che qualcuno abbia creato una libreria per questo chiamato C # Eval .

EDIT: collegamento aggiornato per indicare Archive.org in quanto sembra che il sito originale sia morto.

Quello di cui hai bisogno è una class CSharpCodeProvider

Ci sono diversi esempi per capire come funziona.

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

Il punto importante di questo esempio è che puoi fare tutte le cose su flay in effetti.

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

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

Questo esempio è buono coz è ansible creare file dll e quindi può essere condiviso tra altre applicazioni.

Fondamentalmente puoi cercare http://www.codeproject.com/search.aspx?q=csharpcodeprovider&x=0&y=0&sbo=kw&pgnum=6 e ottenere link più utili.