ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Roslyn入门- 动态运行代码

2021-12-16 17:35:00  阅读:191  来源: 互联网

标签:Microsoft Assembly 入门 代码 dll Roslyn var using compilation


从Nuget安装

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;

 

如果语法有错误,就会在下面的textbox显示编译错误

/// <summary>
        /// 多运行几次,就过100M内存了.不定期GC后也要占用50M
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRun_Click(object sender, EventArgs e)
        {
            txtErr.Text = "";
            var text = txtScript.Text;
            var tree = SyntaxFactory.ParseSyntaxTree(text);

            var systemReference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);

            var compilation = CSharpCompilation.Create("calc.dll")
                .AddSyntaxTrees(tree)
                .AddReferences(systemReference)
                .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            Assembly compiledAssembly;
            //string outputPath = System.Windows.Forms.Application.StartupPath + "\\PlugIn\\" + "calc.dll";
            //calc.dll保存在内存,没保存在文件
            using (var stream = new MemoryStream())
            {
                var compileResult = compilation.Emit(stream);
                //var compileResult = compilation.Emit(outputPath);//假如保存到c盘,需要权限
                //用文件的话,再Emit的时候,会出现calc.dll”正由另一进程使用,因此该进程无法访问此文件。”

                if (!compileResult.Success)
                {
                    foreach (var item in compilation.GetDiagnostics())
                    {
                        txtErr.Text+= item.GetMessage() + Environment.NewLine;
                    }
                    MessageBox.Show("编译失败");
                    return;
                }
               
                compiledAssembly = Assembly.Load(stream.GetBuffer());
                //compiledAssembly = Assembly.LoadFile(outputPath); 
            }

            try
            {
                var calculatorClass = compiledAssembly.GetType("Calculator");
                if(calculatorClass!=null)
                {
                    var evaluateMethod = calculatorClass.GetMethod("Evaluate");
                    var result = evaluateMethod.Invoke(null, null).ToString();
                    Console.WriteLine(result);
                    MessageBox.Show(result);
                }
            }
               
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }

        }
        //占用30M内存
        private void btnSnippet_Click(object sender, EventArgs e)
        {
            try
            {
                var scriptState = CSharpScript.RunAsync<int>("if(DateTime.Now.Hour<12) return 13+2*5;else return 0;", 
                    ScriptOptions.Default.AddImports("System","System.IO"));
                MessageBox.Show(scriptState.Result.ReturnValue.ToString());

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
               
            }
        }

 

标签:Microsoft,Assembly,入门,代码,dll,Roslyn,var,using,compilation
来源: https://www.cnblogs.com/zitjubiz/p/Roslyn_run_dynamic_code.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有