This is a mirror of official site: http://jasper-net.blogspot.com/

Runtime Compilation (A .NET eval statement)

| Monday, March 7, 2011
Introduction

There are several languages out there (primarily interpreted languages) which provide a convenient eval statement or function. These usually accept simple fragments of code and execute them on the fly, often used for mathematical expressions. .NET leaves this useful feature out of its BCL (Base Class Library), and buries access to its compiler under incomplete documentation. I was working on a project of my own when I realized that I needed some form of runtime compilation, and went off on a tangent to build an easy-to-use library (also adding full XML documentation).

Using the code

The library is centered around the Eval class, which contains the static methods that access the compiler.

The methods provided are as follows:

public static AssemblyResults CreateAssembly(ICodeCompiler compiler,
                                          string assemblySource,
                                          CompilerParameters options,
                                          Language language);

public static TypeResults CreateType(ICodeCompiler compiler,
                                     string typeSource,
                                     string typeName,
                                     CompilerParameters options,
                                     Language language);

public static MethodResults CreateMethod(ICodeCompiler compiler,
                                         string methodSource,
                                         string methodName,
                                         CompilerParameters options,
                                         Language language);

public static AssemblyResults CreateVirtualAssembly(ICodeCompiler compiler,
                                         string assemblySource,
                                         bool debug,
                                         Language language,
                                         params string[] references);

public static TypeResults CreateVirtualType(ICodeCompiler compiler,
                                         string typeSource,
                                         string typeName,
                                         Language language,
                                         bool debug,
                                         params string[] references);

public static MethodResults CreateVirtualMethod(ICodeCompiler compiler,
                                         string methodSource,
                                         string methodName,
                                         Language language,
                                         bool debug,
                                         params string[] references);

Each method compiles the source provided, loads the result into memory, and returns a reference to an object wrapping the final result (along with any warnings generated by the compiler). If any errors are generated during the compilation, a CompilationException is thrown, which contains the compiler's errors. The "Virtual" group of methods stores the results of compilation directly to memory, using a pre-generated set of CompilerParameters.

The Language class and its subclasses provide information about an individual language to the Eval class, exposing methods that generate various language-specific segments of the code which are necessary in the CreateType and CreateMethod methods of the Eval class.

Read more: Codeproject

Posted via email from Jasper-net

0 comments: