execute c# code at runtime from code file
Solution 1
You can use Microsoft.CSharp.CSharpCodeProvider
to compile code on-the-fly. In particular, see CompileAssemblyFromFile.
Solution 2
Code sample for executing compiled on fly class method:
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);
}
}
}
Solution 3
I recommend having a look at Microsoft Roslyn, and specifically its ScriptEngine
class.
Here are a few good examples to start with:
- Introduction to the Roslyn Scripting API
- Using Roslyn ScriptEngine for a ValueConverter to process user input.
Usage example:
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);
Solution 4
Looks like someone created a library for this called C# Eval.
EDIT: Updated link to point to Archive.org as it seems like the original site is dead.
Solution 5
What you need is a CSharpCodeProvider Class
There are several samples to understand how does it work.
1 http://www.codeproject.com/Articles/12499/Run-Time-Code-Generation-I-Compile-C-Code-using-Mi
The important point of this example that you can do all things on flay in fact.
myCompilerParameters.GenerateExecutable = false;
myCompilerParameters.GenerateInMemory = false;
2 http://www.codeproject.com/Articles/10324/Compiling-code-during-runtime
This example is good coz you can create dll file and so it can be shared between other applications.
Basically you can search for http://www.codeproject.com/search.aspx?q=csharpcodeprovider&x=0&y=0&sbo=kw&pgnum=6 and get more useful links.
Comments
-
Vinod Maurya over 4 years
I have a WPF C# application that contains a button.
The code of the button click is written in separate text file which will be placed in the applications runtime directory.
I want to execute that code placed in the text file on the click of the button.
Any idea how to do this?
-
acoolaum over 13 yearsI've added in memory compilation
-
acoolaum over 13 yearsPost sample of your code, please. My code doesn't rise file not found exception.
-
Vinod Maurya over 13 yearsI am executing the same code in a new console without any change.
-
acoolaum over 13 yearsIt's work fine for me. May you give me call stack where the exception was thrown?
-
BrainSlugs83 almost 10 yearsIt works for me in .NET 4.0 Client Profile (for both "v3.5" and "v4.0") -- I'm wondering, how would I do it with a DataContext? (i.e. the code I want to pass in is "Property >= 5 && Property < 10" and the method I would wrap it in is essentially "public object GetValue() { return " + code + " }" -- where "Property" is a property on a given datacontext...
-
Martin Braun about 8 yearsBefore you search for the download, just use the Package-Manager:
Install-Package Roslyn
-
Aaron D over 6 years@RichO'Kelly, thanks - I updated it to point to the archive.org version.
-
LosManos about 5 years@VinodMaurya I have noticed I get File not found if compiling fails. Do check for results.Errors.Count before trying to Invoke.