1月 02

几年前有研究过这个类似的东西,实现Javascript里的Eval函数

C# Eval随想 云推送

新发现Roslyn更加好用,以后可以做点好玩的东西了,

研究了一下,记录下来简单的demo

Nuget添加引用

Microsoft.CodeAnalysis.CSharp

或者用Package Manager Console命令

Install-Package Microsoft.CodeAnalysis.CSharp

测试代码如下

            var text = @"
                    public class Calculator
                    {
                        public static int Evaluate() { return 3 + 2 * 55; }
                    }";

            var tree = SyntaxFactory.ParseSyntaxTree(text);

            var compilation = CSharpCompilation.Create("calc.dll", new[] { tree },
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
                 //references: new[] { new MetadataFileReference(typeof(object).Assembly.Location) });
                 references: new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) }); 

            Assembly compiledAssembly;
            using (var stream = new MemoryStream())
            {
                var compileResult = compilation.Emit(stream);
                compiledAssembly = Assembly.Load(stream.GetBuffer());
            }

            var calculatorClass = compiledAssembly.GetType("Calculator");
            var evaluateMethod = calculatorClass.GetMethod("Evaluate");
            var result = evaluateMethod.Invoke(null, null).ToString();
            Console.WriteLine(result);

注意注释部分,这个地方已经有所改变,跟网上存在的方式不太一样了。

written by ocean \\ tags: