• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > C# 动态编译、动态执行、动态调试

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了c站,欲情 c max,c语言,奔驰c200,85度c等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。

如上图,我封装的类CSharpProvider很简单,下面说明一下一些公共成员的用法。

公共属性

AssemblyFileName:这个属性指定动态编译后生成的配件名称。

CompilerParameters:这个属性指定编译的参数

References:这个属性指定被编译代码中的引用。调用者只要调用References.Add("xxx.dll"),就可以加入自己的引用,对于System命名空间的所有引用,不需要手工加入,该类会自动加载。对于用户自己的组件,如果不手工指定引用文件,该类会自动根据名字空间名进行猜测。

SourceCodeFileEncoding:如果以文件形式编译,指定文件的编码类型。

公共方法

public bool Compile(string code)

输入代码字符串,并编译

public bool CompileFromFile(string sourceCodeFileName)

编译输入的代码文件

public object CreateInstance(string code, string typeFullName)

创建类的实例

如下面代码,可以输入 CreateInstance(code, "MyInterface.IHelloWorld"),也可以输入CreateInstance(code, "HelloWorld"),程序会根据

类型名称来自动找到符合条件的类并实例化。如果代码中有多个指定类型的类,将实例化第一个。
这里需要特别指出的是由于用到了AppDomain的远程调用,所有的动态加载的代码必须继承自MarshallByRefObject

如果仅仅声明为[Serializable] 虽然也可以执行,但主应用程序域会记录下子应用程序域的一个引用,这样导致子应用程序

域卸载后,依然无法完全释放内存,从而内存泄漏。所以这个很关键,一定要注意。

      public object CreateInstanceFromFile(string fileName, string typeFullName)

      从文件创建动态实例

      下面再谈谈对动态代码的调试

      动态创建的代码如果不能调试,就像一个黑盒子,对系统的可维护性有较大破坏。未来实现这个功能,我们需要做以下工作,

第一、编译时要生成调试信息,这个可以通过设置 CompilerParameters.IncludeDebugInformation = true;来实现

第二、我们必须告诉调试器源码对应的位置,对于从文件编译的情况,源码文件位置会被自动写入调试信息文件 *.pdb中,而对于从内存编译的情况,我还没有找到指定的方法,如果哪位朋友知道,还望赐教。所以目前如果要调试动态代码,必须从文件编译,也就是调用CompileFromFile,CreateInstanceFromFile。

 第三、我们需要在代码中设置一个断点,这个可以在代码中加入 System.Diagnostics.Debugger.Break(); 来解决。

 如下图所示,动态代码现在可以调试了。

 

 

 应用程序域

 为了避免内存泄漏,本程序封装了对应用程序域的使用,调用者基本不需要关心应用程序域的调用和卸载过程。本程序在

重新编译或者对象销毁时会自动卸载应用程序域,从而释放内存。由于做这个程序是在应用程序域上遇到了很多麻烦,所以

感觉还是有必要简单讲一下应用程序域。

 

 

 如上图所示,应用程序与实际上有点像一个单独的进程,但这个进程是运行在当前进程里面的,当然这个比喻不够贴切。

对应用程序域的调用有点类似进程间采用 Remoting 方式的对象调用,也就是说默认应用程序域要调用其他应用程序域中的对象,

必须采用远程调用的方法,而不能直接调用,如果直接调用,默认应用程序域就会记录这个被调用的应用程序域的一个内存引用,

即使这个应用程序域执行了Unload 方法卸载后,内存依然无法释放,这也是我一开始操作应用程序域遇到的最大困扰。

另外所有暴露在两个应用程序域之间的类必须从MarshalByRefObject基础,这点非常重要,否则将导致内存无法释放。

本程序的一些缺陷

1、没有提供编译多文件的接口,其实要实现这个很简单,考虑到用于动态执行的代码脚本往往比较简单,所以偷懒没有做。

2、没有提供对动态代码中多个对象的枚举接口,以后再完善吧。
源码下载地址 http://xiazai.weikejianghu.com/200905/yuanma/DynamiclyCompiler.zip

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#开发微信 二维码鼠标滑动 图像显示隐藏效果(推荐)
  • C#开发微信 二维码鼠标滑动 图像显示隐藏效果(推荐)
  • C#.net 微信公众账号接口开发
  • C#实现把图片下载到服务器代码
  • C#将DataTable转化为List<T>
  • C#中OpenFileDialog和PictrueBox的用法分析
  • c#网站WebConfig中域名引用示例介绍
  • C#中的switch case使用介绍
  • C#随机生成不重复字符串的两个不错方法
  • C# 判断两张图片是否一致的快速方法

相关文章

  • 2017-05-11asp.net(C#)函数对象参数传递的问题
  • 2017-05-11ASP.NET中Application全局对象用法实例浅析
  • 2017-05-11asp.net uploadify实现多附件上传功能
  • 2017-05-11asp.net传多个值到其它页面的具体实现
  • 2017-05-11在ASP.NET 2.0中操作数据之二十五:大数据量时提高分页的效率
  • 2017-05-11Asp.net中阻止页面按钮多次提交的解决办法
  • 2017-05-11Aspx/Asp.net 防注入程序 V1.0
  • 2017-05-11.NET中利用js让子窗体向父页面传值的实现方法
  • 2017-05-11.NET程序调试技巧(一):快速定位异常的一些方法
  • 2017-05-11ASP.NET 2.0下随机读取Access记录的实现方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • asp.net动态添加js文件调用到网页的方法
    • vb.net 数组参与SQL语句的查询范例
    • blog程序新版本V2.0 Beta完成,提供V1.0全部源码下载
    • asp.net 合并GridView中某列相同信息的行(单元格)
    • 详解.Net单元测试方法
    • asp.net中CSharpThinking扩展方法分析
    • asp.net获取网站目录物理路径示例
    • 如何用Response.Redirect方法传递汉字
    • 注册页实现激活邮箱验证(asp.net c#)
    • .net socket客户端实例代码分享

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有