roslyn 生成代码_delphi反编译为源码

roslyn 生成代码_delphi反编译为源码Roslyn是微软公司开源的.NET编译器。编译器支持C#和VisualBasic代码编译,并提供丰富的代码分析API。GITHUB地址:https://github.com/dotnet/roslyn.gitRoslyn在vs2013上通过在ManageNuGetPackages中下载安装Microsoft.CodeAnalysis、Microsoft.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺



Roslyn 是微软公司开源的 .NET 编译器。编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。
GITHUB地址:https://github.com/dotnet/roslyn.git

Roslyn在vs2013上通过在 Manage NuGet Packages 中下载安装Microsoft.CodeAnalysis、Microsoft.CodeAnalysis.CSharp、Microsoft.CodeAnalysis.VisualBasic组件以后,
便可以在C#项目和VB项目中使用Roslyn的API。

roslyn 生成代码_delphi反编译为源码

下面是一段使用Roslyn API编写的C#编译器。

public class CSharpScriptEngine
    {
        private static Script _previousInput;
        private static Lazy<object> _nextInputState = new Lazy<object>();
        private static ScriptOptions _options;


        public static void AddReferenceAndNameSpace(string[] assemblys,string[] namespaces)
        {
            ScriptOptions _option = ScriptOptions.Default;
            if (assemblys != null && assemblys.Length > 0)
            {
                foreach (string item in assemblys)
                {
                    var type = Type.GetType(item);
                    if (type == null)
                    {
                        type = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(obj => obj.GetType(item) != null).GetType(item);
                    }
                    _option=_option.AddReferences(Assembly.GetAssembly(type));
                }
            }


            if (namespaces != null && namespaces.Length > 0)
            {
                _option=_option.AddNamespaces(namespaces);
            }


            _options = _option;
        }


        public static object Execute(string code)
        {
            var script = CSharpScript.Create(code, ScriptOptions.Default).WithPrevious(_previousInput).WithOptions(_options);
            var endState = script.Run(_nextInputState.Value);
            _previousInput = endState.Script;
            _nextInputState = new Lazy<object>(() => endState);
            return endState.ReturnValue;
        }


    }

通过调用CSharpScriptEngine中的Execute方法来实现在项目的代码实现期动态的编译我们输入的C#代码,
编译后的代码似乎并不嵌入到原代码(编译以后)中,所以我们需要指定引入代码中需要的Assembly和Namespace,
AddReferenceAndNameSpace方法便是在做这件事。

下面写个简单的测试代码来测试上面的编译器是否可以正常工作。

public void TestCSharpScriptEngine()
        {
            string script = @"
            PowerShellEngine.Invoke(""Get-Date"",null)
            ";


            string[] assemblys = { "MyWebProjectService.CSharpScriptEngine", "System.Management.Automation.PSObject", "System.Collections.ObjectModel.Collection`1" };
            string[] namespaces = { "MyWebProjectService" };
            CSharpScriptEngine.AddReferenceAndNameSpace(assemblys,namespaces);
            Collection<PSObject> result = (Collection<PSObject>)CSharpScriptEngine.Execute(script);


        }

测试代码中我们动态给加入我们自己写的C#代码 “PowerShellEngine.Invoke(“”Get-Date””,null)” 调用PowerShellEngine
类的Invoke方法来执行一个Get-Date命令。

这里有篇文章比较详细的介绍了Roslyn API的各种用法:http://www.daveaglick.com/posts/compiler-platform-scripting

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195777.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • javaweb-springMVC-56

    javaweb-springMVC-56

    2021年5月18日
    122
  • java和python哪个值得学-学java好还是Python好?

    java和python哪个值得学-学java好还是Python好?首先我简单的说下目前的市场发展行情,Java和Python发行时间都有很多年了,但是或许你自己也应该清楚,Python是什么时候开始步入我们的生活,步入我们的眼线的,对,就是近几年,这几年随着培训机构的不断兴起,互联网的快速发展,就我自己处在这个圈子来看,Python炒的有点凶了,大家都说Python是一胶水编程语言,意思就是说他可以做很多方面的工作,可以做:web开发,网络爬虫,数据分析,机器学…

    2022年7月8日
    19
  • 0基础如何自学软件编程开发

    0基础如何自学软件编程开发0基础如何自学软件编程开发?学习软件编程首先需要选择一门编程语言,如C或JAVA语言,作为基础编程语言学习,掌握语言的逻辑,学习语法,其实编程实质上就是思路的运用,编程思路有了再想学习其他的编程语言就会变得顺风顺水。软件编程开发,对于现在的学生来讲到底有多重要呢?现在是互联网快速发展的时期,在几年前谁都没有想到人们在手机上就可以完成衣食住行等所有的活动,互联网也在慢慢的改变着未来一代人。互联网广泛覆盖了我们的生活,真正实现了“远在天边,近在眼前”,在我们的生活工作中都有互联网存在的身影,随着IT行业的越

    2022年5月7日
    75
  • 初探sendfile「建议收藏」

    初探sendfile「建议收藏」很早就知道sendfile这个专门用来传输大文件的函数,也称为零拷贝,但一直没测试过,今天用了宿舍的网和小组内的网测试了下,发现结果和我预想的不一样。为什么效率高,网上说的也很多了,看下man手册中的内容sendfile()copiesdatabetweenonefiledescriptorandanother.Becausethiscopyingisdo

    2022年6月6日
    41
  • 登录Exchange 2013 OWA或ECP “HTTP 500内部服务器错误”的解决办法[通俗易懂]

    登录Exchange 2013 OWA或ECP “HTTP 500内部服务器错误”的解决办法[通俗易懂] 1. 安装好ExchangeServer2013后,打开IE访问https://mail.contoso.com/ecp或https://mail.contoso.com/owa,输入用户名密码登陆后提示“HTTP 500 内部服务器错误”,如下图1  2. 解决方法:打开ExchangeManagementShell,运行以下命令禁用邮箱后再启用邮箱,如下图2Di…

    2022年8月11日
    4
  • Java中的throw和throws的差别

    Java中的throw和throws的差别

    2022年1月24日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号