53

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?

NoWar
  • 36,338
  • 80
  • 323
  • 498
Vinod Maurya
  • 4,167
  • 11
  • 50
  • 81

5 Answers5

99

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);
        }
    }
}
acoolaum
  • 2,132
  • 2
  • 15
  • 24
  • 1
    I've added in memory compilation – acoolaum Nov 15 '10 at 06:19
  • Post sample of your code, please. My code doesn't rise file not found exception. – acoolaum Nov 15 '10 at 11:01
  • I am executing the same code in a new console without any change. – Vinod Maurya Nov 16 '10 at 05:27
  • It's work fine for me. May you give me call stack where the exception was thrown? – acoolaum Nov 16 '10 at 05:35
  • It 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... – BrainSlugs83 Jul 05 '14 at 01:07
  • 1
    @VinodMaurya I have noticed I get File not found if compiling fails. Do check for results.Errors.Count before trying to Invoke. – LosManos Mar 31 '19 at 21:09
38

You can use Microsoft.CSharp.CSharpCodeProvider to compile code on-the-fly. In particular, see CompileAssemblyFromFile.

jason
  • 236,483
  • 35
  • 423
  • 525
23

I recommend having a look at Microsoft Roslyn, and specifically its ScriptEngine class. Here are a few good examples to start with:

  1. Introduction to the Roslyn Scripting API
  2. 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);
Adi Lester
  • 24,731
  • 12
  • 95
  • 110
3

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.

Aaron D
  • 5,817
  • 1
  • 36
  • 51
2

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.

NoWar
  • 36,338
  • 80
  • 323
  • 498