程序动态编译代码

yeshuimaowei yeshuimaowei     2022-09-18     504

关键词:

c#可以在程序运行过程中动态的编译代码,并生成程序集加载在内存,然后就可以动态的调用代码生成的程序了,这有点像我们的vs编译器,感兴趣的可以制作属于自己的c#编译器:

要实现这种功能,我们只需要调用CSharpCodeProvider就可以实现了:

string prefix = "using System;"+
                "public static class Test{"+
                "public static void Run(){";
            string postfix = "}}";
            using (CSharpCodeProvider provider = new CSharpCodeProvider())
            {
                var code = prefix + "Console.Write(\"Hello,Wolrd,Jack\");" + postfix;
                var compilerResult= provider.CompileAssemblyFromSource(new CompilerParameters() { GenerateInMemory = true }, code);
                var type = compilerResult.CompiledAssembly.GetType("Test");
                type.InvokeMember("Run", BindingFlags.Static|BindingFlags.InvokeMethod|BindingFlags.Public, null, null, null);

            }


这段代码 就是把一个Test的类动态编译,然后执行类里面的Run方法,在控制台输出Hello,Wolrd,Jack;注意的是,你添加的文本代码里面需要注意语法,如果有语法错误,是编译不了的,不像我们的vs 它有代码提示功能,所以自己编写的代码文本一定不能有错;


image

roslyn(代码片段)

...定义编译器动作等操作。将Roslyn编译结果保存在流中,用程序集加载方法将流加载到当前程序集中,就可以在当前的程序集中调用了。Roslyn支持两种方式的动态编译:源代码动态编译就是对C 查看详情

c#动态编译(代码片段)

公司需要自己做一个打包程序,将需要升级文件和脚本做成一个exe安装包,双击exe安装包的时候输入相关的参数就执行升级(文件覆盖和脚本执行),大概思路如下:1.先把exe的逻辑写好,包括提取文件和脚本执行代码2.exe从资... 查看详情

gcc编译使用动态链接库和静态链接库(代码片段)

...生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接... 查看详情

qt动态库编译,是不是只要声明

...动态的意思应该是模块代码是动态加载的而不是随着应用程序一起编译只要动态库里的函数接口不变应用程序就无需重新编译只需将动态库重新编译后替换掉旧的动态库即可如果动态库的函数接口有变动那么应用程序就要重新编... 查看详情

79动态编译与动态运行

...加载器的过程,就是动态编译与动态运行的过程。如何在程序中动态编译?我们通过ToolProvider类获取JavaCompiler编译器工具,就可以对指定的文件进行编译。JavaCompilercompiler=ToolProvider.getSystemJavaCompiler(); intresult=compiler.run(null,null,nu... 查看详情

java之动态编译

...编缉大家可能会想到,动态编缉肯定不是像我们平时运行程序似的在本地的平台就开始编译了。动态编译其实是在程序的运行过程中对Java文件的编译或者是运行.class的文件。比如说我今天想装 查看详情

ios中的静态库和动态库(代码片段)

什么是库库是共享程序代码的方式,库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库的类型一般分为静态库和动态库。静态库一般是xxx.a的形式,动态库一般在windows下是xxx.dll、在Linux下是... 查看详情

ios中的静态库和动态库(代码片段)

什么是库库是共享程序代码的方式,库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库的类型一般分为静态库和动态库。静态库一般是xxx.a的形式,动态库一般在windows下是xxx.dll、在Linux下是... 查看详情

sourcegenerator初探(代码片段)

...可以直接引用动态生成的代码。优势加快运行速度原有的程序机制是初次运行时通过反射进行依赖注入,这时会导致第一次运行加载大量数据,运行会慢,再一个不利于AOT编译。而SourceGenerator是在编译时完成依赖注入,把之前运... 查看详情

linux编译动态链接库(代码片段)

准备好头文件编译文件生成.so动态链接库文件g++-shared-fPICmylib.cpp-olibmylib.so其他程序调用动态链接库g++test.cpp-lmylib-L/root/lib-l(小写L)指定调用的库名称-L指定库的路径#!/bin/bashLD_LIBRARY_PATH=./exportLD_LIBRAR 查看详情

动态源代码生成和编译

...档对象模型”(CodeDOM)的机制,该机制使编写源代码的程序的开发人员可以在运行时,根据表示所呈现代码的单一模型,用多种编程语言生成源代码。    为表示源代码,CodeDOM元素相互链接以形成一个数据结构(... 查看详情

gcc编译过程与动态链接库和静态链接库(代码片段)

...是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存... 查看详情

一波程序员搞笑动态图

1、当我改完最后一个Bug,以为可以关闭bug单的时候…2.当你的代码没有错误,没有警告,一次便编译通过时~3.当我开始使用新框架,却忘记阅读文档时4.放完假,第一天回来上班的你5、收拾东西准备下班的时候,测试又提bug过来... 查看详情

简单理解弱类型动态类型解释型语言(代码片段)

...以动态改变结构。 解释型和编译型用编译型语言写的程序执行之前,需要先有一个专门的编译过程,以后就可以直接运行而不需要编译了,例如windows的exe文件,因为翻译只做了一次,运行时不需要翻译,所以编译型语言的... 查看详情

linux静态库和动态库编译的区别

...在库文件名后加上版本号为后缀,例如:libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。ln-slibhello.so.1.0libhello.so.1ln-slibhello.so.1libhello.so动态库和静态库的区别:当要使用静... 查看详情

rpmyum源代码编译

程序包的编译与安装程序源代码-->预编译-->编译-->汇编-->链接-->运行链接时关联到相关的数据库编译又分静态编译:程序文件自带库动态编译:.so程序文件不自带库,而是共享操作系统的库来编译API:应用程序接口编... 查看详情

编译动态矩阵时出现file.exe错误

...编译时我没有收到任何错误消息,除了运行这部分代码时程序中间的file.exe错误。它说file.exe已停止工作。有人能看出这段代码有什么问题吗?头文件#pragm 查看详情

动态数据库的啥是动态链接库?

...分开存储的函数。DLL还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL副本的内容。动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。由于DLL代码使用了... 查看详情