[Mono-list] Using CSharpCodeProvider in Mono

Paulo Aboim Pinto esqueleto at tusofona.com
Mon Aug 25 09:18:52 EDT 2008


Hello,

I'm developing an application that will run in a Windows box in Linux box
and we have a method to Evaluating Expressions and for that I'm using the
CSharpCodeProvider to create a dynamic method to return the  value of the
math expression.

In windows, this works fine but in linux I got the message:

Unhandled Exception: System.ArgumentException: Expression cannot be
evaluated, please use a valid C# expression: 0+1 (  at
System.Reflection.Emit.AssemblyBuilder.DefineDynamicModule (System.String
name, System.String fileName, Boolean emitSymbolInfo, Boolean transient)
[0x00000] )
  at RefletionExample.Program.EvaluateExpression (System.String statement)
[0x00000]
  at RefletionExample.Program.Main (System.String[] args) [0x00000]


The code is very simple:

        static void Main(string[] args)
        {
            Console.WriteLine(EvaluateExpression("0+1"));
        }

        private static string EvaluateExpression(string statement)
        {
            CSharpCodeProvider codeProvider = new CSharpCodeProvider();

            CompilerParameters cp = new CompilerParameters();
            cp.GenerateExecutable = false;
            cp.GenerateInMemory = true;
            cp.OutputAssembly = "Module";

            string ModuleSource = "namespace ns { " +
                                  "using System; " +
                                  "class class1 { " +
                                  "public static string Evaluate(){return ("
+ statement + ").ToString();}}} ";

            CompilerResults cr = codeProvider.CompileAssemblyFromSource(cp,
ModuleSource);

            if (cr.Errors.Count > 0)
            {
                throw new ArgumentException(string.Format("Expression cannot
be evaluated, please use a valid C# expression: {0} ({1})", statement,
cr.Errors[0].ErrorText));
                //return null;
            }
            else
            {
                MethodInfo methodinfo =
cr.CompiledAssembly.GetType("ns.class1").GetMethod("Evaluate");
                return (string)methodinfo.Invoke(null, null);
            }
        }


Can i use this on Mono? What should be the way to do this on Mono!??
The mono version is:
$ mono --version
Mono JIT compiler version 1.9.1 (tarball)
Copyright (C) 2002-2007 Novell, Inc and Contributors. www.mono-project.com
        TLS:           __thread
        GC:            Included Boehm (with typed GC)
        SIGSEGV:       normal
        Notifications: epoll
        Architecture:  x86
        Disabled:      none



Hope you guys help me, in my company was too hard to put something work on
mono and have this problem will kill all mono development... hope there is
an solution for this.


regards
Paulo Aboim Pinto
Odivelas - Portugal
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-list/attachments/20080825/041ccecf/attachment-0001.html 


More information about the Mono-list mailing list