前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >roslyn 生成代码_delphi反编译为源码

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

作者头像
全栈程序员站长
发布2022-09-30 09:07:40
5190
发布2022-09-30 09:07:40
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

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 生成代码_delphi反编译为源码

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

代码语言:javascript
复制
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方法便是在做这件事。

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

代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月8日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档