C#中动态编译应用程序

C#动态编译的实现 在软件开发时,会遇到这种情况:软件开发人员无法掌握使用人员的动态调用。比如,有多个函数,在软件运行时,自动根据字符串参数动态调用相应的函数,执行其功能。在C#中,“后期绑定”技术能很好地解决这个问题。代码如下。  public int InvokeFunction(string namespaceName, string className, string fun 阅读详情

原文:http://www.ccw.com.cn/htm/center/prog/02_10_23_3.asp

武汉制造业信息化工程技术有限公司 杜胜

 

有一位做ASP的朋友问我:“在ASP.NET中的程序如何进行动态的编译,就像在ASP中一样,由自己通过程序生成应用程序文件,然后直接运行。”

我不禁失笑,可转念一想,在一个既要灵活又要高效率的

系统中我们确实需要遵循某些规则来动态生成一些程序,然后由新的程序来负担新的任务,这样运行的效率才比较高。当然也可以使用不同的配置信息利用同一个程序完成,但是这就好像使用Html和使用应用程序作为主要浏览格式的网站一样,当然是Html浏览的速度更快,效率更高。

于是我回答他说直接把代码写在aspx文件中,不使用Codebehind技术,他想了很长时间说,不行,那样代码不就让人给看见了。

既要保证代码的安全又要满足高效率,于是我开始认真思考这个问题,觉得有深入研究的必要,经过摸索,现将一些心得体会公布于众。

大家都知道,在ASP.NET中利用CodeBehind技术编写好的文件必须先通过编译,然后才能被执行。我们一般是在VS.NET中或者命令行下进行编译,那么现在的问题就是在程序中进行编译,也就是自己通过做好的规则动态生成一些程序源文件、然后对其进行编译。查看.Net Framework中提供的类库,发现了Microsoft.Csharp这个命名空间,其中有一个类Compiler。要调用这个类库必须先在引用中添加D:/WINNT/Microsoft.NET/Framework/v1.0.3705/cscompmgd.dll这个文件,这是我机器上的路径,各位根据自己机器所在路径设置吧。

仔细研究Compiler这个类:不需要初始化,直接可使用Compile方法,其中包含了5个参数。

string[] sourceTexts 源代码数组 其中每一个值包含一个文件中的源码

string[] sourceTextNames 源文件名数组 其中每一个值包含了一个文件名和上面的源代码数组中的值一一对应。

string target 输出的文件名

string[] imports 引用类库数组 也就是我们在VS.net中引用的那些类库的文件路径,一般都是dll文件,其中一个值表示一个引用文件。

IDictionary options 参数设置,实际上这也是一个数组,可以包含多个参数,具体的参数我在下面的部分会讲到。

实际这个Compile这个方法要求我们输入这些条件:

1、源代码——这个是必须的,没有源代码没法编译,那么源代码要求我们从程序文件中读取出来。

2、源文件的名称,和读取出的源代码一一对应。

3、编译输出的文件名,也可不填

4、引用的类库文件,如System.dll,System.data.dll这些都是经常会用到的。

5、其他参数设置

第一步:创建一个类及调用方法

首先我们创建一个Class

using System;

using System.IO;

using System.Text;

using Microsoft.CSharp;

namespace MyTest

{

private String[] filelist; //文件列表

private String[] cscode; //源代码

private String[] filename; //文件名

private String[] import; //引用类库

public class MyComplier()

{

//这里我做了一个简单的方法,要求用户输入两个参数,一个是文件夹的绝对路径

另外一个是输出的文件路径

public CompilerError[] MyCompile(String realpath,String output)

{

//……………………

}

}

}

那么下面我们会一步步来讲解如何实现这个方法。

第二步:读取程序文件列表

由于使用CodeBehind,那么实际上要编译的也就是扩展名为CS的文件。首先读取文件列表,制作一个方法用来读取目录下的文件路径:通过用户输入的绝对路径对文件进行整理搜索。

public String[] GetFileList(String realpath)//输入绝对路径

{

return System.IO.Directory.GetFiles(realpath,”*.cs”);//输入搜索条件

}

本方法将要编译的真实目录传递进入,然后返回目录下扩展名为CS的文件路径列表。那么读取文件的列表将会为文件中代码的获取及文件名的获取做准备。

第三步:读取程序文件内容

//这里我们调用了第二步建立的方法来获取文件列表

filelist= GetFileList(realpath); //获取文件路径列表

//根据文件的数量创建数组

cscode=new String[filelist.Length]; //建立源代码数组

String[] filename=new String[filelist.Length];//建立源文件名数组

//通过循环获取每个文件的信息每增加到对应的数组中

For (int I=0;I < p>

{

String filepath= filelist. GetValue(i).ToString();//获取单个文件路径

cscode[I]= ReadTxtFile(filepath, Encoding.GetEncoding("GB2312"));//读取源文件中的代码、这里的编码为GB2312,也可设置为其他,这里调用的是我们下面创建的一个方法

filename[I]= System.IO.Path.GetFileName(filepath);//获取文件名

}

//读取文本文件内容

public String ReadTxtFile(String path,Encoding encode)

{

String str="";

try

{

if (File.Exists(path))

{

StreamReader sr=new StreamReader(path,encode);

str=sr.ReadToEnd();

sr.Close();

}

}

catch(IOException ex)

{Console.Write(ex.ToString());}

return str;

}

经过第二步之后我们已经满足了Compile方法所需的两个参数了,那么接下来将是对文件的输出及引用的一些配置。

第四步:配置输出文件名及路径

此处可根据你的需要,设置文件和路径,例如:E:/test/bin/test.dll String output=” E://test//bin//test.dll”;

这里我们根据用户输入的路径进行操作。

第五步:配置引用的类库文件

那么只要是你在程序引用到的类库,在此处都必须加入到数组中。

import=new String[10];//定义一个数组,数组长度根据你所需要引用的文件数量决定

import[0]="D://WINNT//Microsoft.NET//Framework//v1.0.3705//System.dll";

import[1]="D://WINNT//Microsoft.NET//Framework//v1.0.3705//IEHost.dll";

import[2]="D://WINNT//Microsoft.NET//Framework//v1.0.3705//System.Data.dll";

import[3]="D://WINNT//Microsoft.NET//Framework//v1.0.3705//System.Drawing.dll";

import[4]="D://WINNT//Microsoft.NET//Framework//v1.0.3705//System.Web.dll";

import[5]="D://WINNT//Microsoft.NET//Framework//v1.0.3705//System.Xml.dll";

import[6]="D://WINNT//Microsoft.NET//Framework//v1.0.3705//cscompmgd.dll";

上面的是我们经常用到的一些类库,除此之外,你自己编写的一些类库,如果也被引用到了,那么也必须增加到数组中。

第六步:进行属性参数配置

这里系统提供给了我们一个接口:Idictionary,这个接口可使用以下几个类来实现。

ListDictionary 使用单链接列表实现 IDictionary。建议用于通常包含 10 个或 10 个以下项的集合。

HybridDictionary在集合较小时,使用 ListDictionary 来实现 IDictionary,然后当集合变大时,切换到 Hashtable。

还有其他一些,我感觉用不上,这里就不讲了。那么,具体来看看:

System.Collections.IDictionary configs=new System.Collections.Specialized.ListDictionary();//实现这个接口

configs.Add("target","library"); //配置输出文件类型为库文件,这个参数是必须的

其中”target”为文件的格式属性,”library”为属性的值。

其他属性有:

addmodule 导入元数据 要包含在此程序集内的模块列表。模块名必须用竖线或管道字符分隔。值的类型必须是 String。

baseaddress 库的基址。值的类型必须是 Uint32

bugreport 产生错误报告文件。值的类型必须是 String。

checked 检查整数算法 设置默认表达式计算为选中(或未选中)。值的类型必须是 Boolean。

Debug发出调试信息 值的类型必须是 Boolean。不能指定“全部”或“pdbonly”。

Lib 指定程序集引用位置 查找模块和引用的程序集时要搜索的附加路径。值的类型必须是 String。

Unsafe启用不安全模式 允许不安全构造。值的类型必须是 Boolean

win32icon自动生成的 Win32 资源的 Win32 图标。值的类型必须是String

这里讲出主要的一些参数,还有一些由于用得比较少,那么就不一一列出了。

第七步:程序编译

CompilerError[] ce= Compiler.Compile(cscode,filename, output,import, configs);

那么实际上我们最后的编译也就是调用这个方法,此方法将会返回一个包含出错信息的数组。其中记录了编译过程中的出错信息,如果有错误信息返回,则编译无法通过。

最后我们将第一步中的方法整合:

public CompilerError[] MyCompile(String realpath,String output)

{

//……………………

通过上面的方法获取到参数,最后执行编译。

CompilerError[] ce= Compiler.Compile(cscode,filename, output,import, configs);

return ce;

}

到这里,基本上整个编译过程就完成了,大家可以在Aspx页面中调用或者在其他的类中调用,编译出来的效果和VS.net比起来一点不差,而且速度也非常快。大家甚至可以构建一个基于Web的简易的集成开发环境,当然这是后话了。

最后大家如果编译完成后,不要忘记删除掉源文件,这个很简单,我就不多讲了。

如何用C#动态编译应用程序来执行自定义代码 <br /><br />大家都知道,在ASP.NET中利用CodeBehind技术编写好的文件必须先通过编译,然后才能被执行。我们一般是在VS.NET中或者命令行下进行编译,那么现在的问题就是在程序中进行编译,也就是自己通过做好的规则动态生成一些程序源文件、然后对其进行编译。查看.Net Framework中提供的类库,发现了Microsoft.Csharp这个命名空间,其中有一个类Compiler。要调用这个类库必须先在引用中添加D:/WINNT/Microsoft.NET/Framework/v1.0. 阅读详情

相关推荐

C#代码动态编译、动态执行、动态调试

C#代码动态编译、动态执行、动态调试Author:Eaglet    前几天看到一篇关于.net动态编译的文章 .NET中的动态编译 ,很受启发。在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。           如上图,我封装的类CSharpProvider

eaglet的专栏 2445

c# 动态编译类

记录实现动态编译c# 类的方法实现c#类动态编译。

quebridge的博客 725

C# 动态编译的简介与实例代码

首先,我们定义了要执行的代码字符串,其中包含一个名为Calculator的类,其中有一个Add方法用于执行加法运算。否则,我们获取编译后的程序集,并使用反射创建Calculator类的实例,并调用Add方法执行加法运算。在C#中,我们可以使用System.Reflection命名空间中的类型和方法来实现动态编译。通过动态编译,我们可以在运行时生成和执行代码,从而实现一些动态性和灵活性要求较高的功能。例如,我们可以根据用户的输入动态生成代码,或者在某些场景下动态生成、加载和执行插件。

BfuPhp的博客 637

C#中自定义方法,动态编译,生成dll文件

最近研究从页面手动编写C#方法内容,并编译生成dll文件供其他用户调用。在此做出简单总结。 1.生成cs文件。 这里可以定义一个cs文件模板,当用户页面输入方法具体内容后,将内容填充到模板中,这里需要注意的是:自定义方法的返回值和传入的参数理论上应该都是objec类型,因为在反射调用的时候,方法允许输入的参数类型也是object的,所以,这里你的方法不管定义的是何种类别的参数,最后传入的...

weixin_30909575的博客 234

ESXI 8.0.3 ubuntu 24.04 直通显卡P40

手把手,一步步教你直通GPU,ESXI 8.0.3 ubuntu 24.04 直通显卡P40

qq_36433118的博客 4683

Linux之GTK系列教程

00、背上行囊1——程序员学习之道 01、背上行囊2——为什么要学习GTK 02、背上行囊3——GUI概述 03、背上行囊4——GTK简介 04、背上行囊5——GTK环境搭建( Linux ) 05、背上行囊6——GTK环境搭建( windows ) 06、踏上旅途1——一个简单的空白窗口 07、踏上旅途2——控件的添加 08、踏上旅途3——布局容器之水平布局 09、踏上旅途

每天积累一点点 2万+

c# 执行动态编译的方法

在C#中执行动态编译的一种方法是使用。

大黄鸭在发光的专栏 1134

别再只会setStyleSheet了!Qt实现背景透明的5种方法全解析(附性能对比)

本文深入解析Qt实现背景透明的5种高阶方案,包括QPalette、setWindowOpacity、QGraphicsOpacityEffect、样式表和复合透明方案,并提供详细的性能对比与优化建议。针对不同平台和场景,帮助开发者选择最适合的透明效果实现方式,提升UI设计质量与性能表现。

weixin_27061475的博客 259

让C#语言充当自身脚本!——.NET中的动态编译

让C#语言充当自身脚本!——.NET中的动态编译 原文:让C#语言充当自身脚本!——.NET中的动态编译 代码的动态编译并执行是.NET平台提供给我们的很强大的一个工具,用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代...

weixin_30640769的博客 1167

emqx Java 订阅以及发送 结合若依框架

emqx Java 订阅以及发送 结合若依框架

Spo的博客 1613

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 137

艾伟:C#代码动态编译、动态执行、动态调试

  前几天看到一篇关于.net动态编译的文章 .NET中的动态编译 ,很受启发。在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。           如上图,我封装的类CSharpProvider很简单,下面说明一下一些公共成员的用法。       公共属性       Asse...

weixin_34345753的博客 155

EMC原理-传导(共模、差模)与辐射(近场、远场)详解

本文深入介绍了电磁兼容(EMC)的基本概念,包括EMI和EMS,以及如何处理传导干扰(共模、差模)和辐射干扰(近场、远场)。详细讨论了近场感应、远场辐射的原理,滤波器和屏蔽技术在抑制噪声信号中的作用。此外,探讨了差模和共模干扰的来源、影响及滤除方法,如使用差模电感、电容和共模线圈。最后,提到了穿心电容在滤除高频噪声中的应用。

让你爱上电路设计 3553

C# 动态编译

CSharpCodeProvider 是 .NET 提供的一个强大工具,它允许开发人员在应用程序运行时动态地生成和执行 C# 代码。这一特性为后端开发带来了前所未有的灵活性和动态性,特别是在处理那些需要高度定制化或难以在编译时确定逻辑的场景时,尤为有用。

熊思雨的博客 1965

3.1 5分钟搞定!Claude Code接入国产大模型完整教程(附代码)

摘要 本文提供了一份5分钟快速为Claude Code接入国产大模型的完整教程。首先介绍了系统环境要求(Windows/macOS/Linux、Node.js 18+、Python 3.8+),然后详细说明了三种安装Claude Code的方式(npm/yarn/pnpm)。重点讲解了两种国产大模型接入方案:通义千问(推荐)和文心一言,包括获取API密钥、安装SDK、创建MCP服务器、配置Claude Code等步骤。文中提供了详细的代码示例和配置文件模板,确保开发者能快速完成国产大模型的接入,降低使用成本

yonggeit的博客 7926

CKS-CN考试之路----04

根据上面信息我们知道,这个pod运行在default命名空间下,pod名字为cpu-77cd5ddcbf-bvb8w。可以从/etc/falco/falco_rules.yaml中获得相关内容,大概在文件的460行左右.编辑/etc/falco/falco_rules.local.yaml。7c688a8bfd69即是我们想要获得的docker id。将行为不当 Pod 的 Deployment 缩放为零副本。根据我们刚才定义的rule生成报告。访问/dev/mem 的 Pod。那么如果考试记不住怎么办?

Q先生 602

实现代码灵活性:用Roslyn动态编译和执行存储在数据库中的C#代码

允许用户通过自定义脚本扩展应用程序功能,例如在游戏中编写自定义逻辑或在企业应用中添加业务规则。通过使用Roslyn编译器平台,我们可以在C#中动态编译和执行存储在数据库中的代码。这为应用程序提供了极大的灵活性,但也需要注意安全性和性能问题。希望本文能帮助你理解如何实现动态编译,并在实际项目中加以应用。

Hellc007的博客 1251

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C#动态编译的小程序

using System;using System.Text;using System.Windows;using System.Windows.Media;using Microsoft.CSharp;using System.CodeDom.Compiler;using System.Reflection;using System.IO; namespace

854

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C#.NET4.0动态脚本解析大全(收集版+原创)

方法一)      第一类:CSharpCode,例如用CODEDOM模型的那种,不过不能在Silverlight下使用。  C#.NET4.0提供一种ScriptRuntime的机制,直接可以运行RUBY和PYTHON的开源iron版本,使用比较简单。 直接引用单元并且设置变量,EXECUTE即可,最后通过字符串变量获取即可。  详细参考《c#高级编程》 var engi

蓝叶菱的专栏 4310

c# 反射 调用wbservice

1.运行结果 1.1webservice程序 1.2 控制台应用程序 2.代码 2.1 webService using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Description; namespace WebApplication1 { /// &..

xie__jin__cheng的博客 327

C#代码解释器

1、C#代码解释器简介 能够动态执行 C#代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C#代码,然后程序自动编译并执行这一行代码,将结果显示给我们。这差不多就是一个最简单的 C#代码解释器了。 动态执行 C#代码又是一件很有用的功能,比如,我们可以将某些代码写在某个文件之中,由程序集在执行时进行加载,改变这些代码不用中止程序,当程序再次加载这些代码时,就自动执行的是新代码了

性别男、爱好女 2848

分析、调试内存泄漏的应用程序

国内私募机构九鼎控股打造APP,来就送20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J(不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。 -------------------------...

weixin_30362083的博客 62
上一篇: 元编程技术和动态编译
下一篇: ASP.NET Whidbey 中新的代码编译功能
colderboy
博客等级 码龄26年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值