log4net开发使用手册

log4net开发使用手册
log4net开发使用手册

log4net使用手册

1 简介

1.1Log4net的优点:

几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。

经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。

Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。

1.2Log4net的安装:

用户可以从https://www.360docs.net/doc/c34067434.html,/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入V isual Studio .NET,编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可。

2 Log4net的结构

log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及Layout(布局).

2.1Logger

2.1.1 Logger接口

Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。

Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.c和a.b,那么我们说a.b是a.b.c的祖先。每一个logger 都继承了祖先的属性

Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口。你可以参考在/extension目录下的几个例子。

ILog接口的定义如下:Log4net框架定义了一个叫做LogManager的类,用来管理所有的

logger对象。它有一个GetLogger()静态方法,用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象,它也会为我们创建一个Logger对象。代码如下所示:

public interface ILog

{

void Debug(object message);

//…

//以上的每一个方法都有一个重载的方法,用来支持异常处理。

//每一个重载方法都如下所示,有一个异常类型的附加参数。

void Debug(object message, Exception ex);

//…

//Boolean 属性用来检查Logger的日志级别

bool isDebugEnabled;

//…其他方法对应的Boolean属性

}

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

通常来说,我们会以类(class)的类型(type)为参数来调用GetLogger(),以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得,或者可以用如下的反射方法来获得:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType

尽管符号长了一些,但是后者可以用于一些场合,比如获取调用方法的类(class)的类型(type)。

2.1.2 日志的级别

正如你在ILog的接口中看到的一样,有五种不同的方法可以跟踪一个应用程序。事实上,这五种方法是运作在Logger对象设置的不同日志优先级别上。这几种不同的级别是作为常量定义在log4net.spi.Level类中。你可以在程序中使用任何一种方法。但是在最后的发布中你也许不想让所有的代码来浪费你的CPU周期,因此,框架提供了7种级别和相应的Boolean 属性来控制日志记录的类型。

Level有以下几种取值

级别

允许的方法

Boolean属性

优先级别

OFF

Highest

FA TAL

void Fatal(...);

bool IsFatalEnabled;

RROR

void Error(...);

bool IsErrorEnabled;

WARN

void Warn(...);

bool IsWarnEnabled;

INFO

void Info(...);

bool IsInfoEnabled;

DEBUG

void Debug(...);

bool IsDebugEnabled;

ALL

Lowest

表1 Logger的日志级别

在log4net框架里,通过设置配置文件,每个日志对象都被分配了一个日志优先级别。如果没有给一个日志对象显式地分配一个级别,那么该对象会试图从他的祖先继承一个级别值。

ILog接口的每个方法都有一个预先定义好了的级别值。正如你在表1看到的,ILog的Inof()方法具有INFO级别。同样的,以此类推,Error()方法具有ERROR级别。当我们使用以上的任何一种方法时,log4net框架会检查日志对象logger的级别和方法的级别。只有当方法的级别高于日志级别时,日志请求才会被接受并执行。

举例说明,当你创建了一个日志对象,并且把他的级别设置为INFO。于是框架会设置日志的每个Boolean属性。当你调用相应的日志方法时,框架会检查相应的Boolean属性,以决定该方法能不能执行。如下的代码:

https://www.360docs.net/doc/c34067434.html,("message");

Logger.Debug("message");

Logger.Warn("message");

对于第一种方法,Info()的级别等与日志的级别(INFO),因此日志请求会被传递,我们可以得到输出结果”message”。

对于第二种方法,Debug()的级别低于日志对象logger的日志级别(INFO),因此,日志请求被拒绝了,我们得不到任何输出。同样的,针对第三行语句,我们可以很容易得出结论。

在表1中有两个特殊的级别:ALL和OFF。ALL表示允许所有的日志请求。OFF是拒绝所有的请求。

你也可以显式地检查Logger对象的Boolean属性,如下所示:

if (logger.IsDebugEnabled)

{

Logger.Debug("message");

}

2.2Repository

Repository主要用于负责日志对象组织结构的维护。在log4net的以前版本中,框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现,并且定义在log4net.Repository.Hierarchy 名字空间中。要实现一个Repository,需要实现log4net.Repository.ILoggerRepository 接口。但是通常并不是直接实现该接口,而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库(hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。

如果你是个log4net框架的使用者,而非扩展者,那么你几乎不会在你的代码里用到Repository的类。相反的,你需要用到LogManager类来自动管理库和日志对象。

2.3Appender

一个好的日志框架应该能够产生多目的地的输出。比如说输出到控制台或保存到一个日志文件。log4net 能够很好的满足这些要求。它使用一个叫做Appender的组件来定义输出介质。正如名字所示,这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你可以把多个Appender组件附加到一个日志对象上。Log4net框架提供了几个Appender组件。关于log4net提供的Appender组件的完整列表可以在log4net框架的帮助手册中找到。有了这些现成的Appender组件,一般来说你没有必要再自己编写了。但是如果你愿意,可以从log4net.Appender.AppenderSkeleton类继承。

2.4Appender Filters

一个Appender 对象缺省地将所有的日志事件传递到输出流。Appender的过滤器(Appender Filters) 可以按照不同的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预定义的过滤器。使用这些过滤器,你可以按照日志级别范围过滤日志事件,或者按照某个特殊的字符串进行过滤。你可以在API的帮助文件中发现更多关于过滤器的信息。

2.5Layout

Layout 组件用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示,主要依赖于我们采用的Layout组件类型。可以是线性的或一个XML文件。Layout组件和一个Appender组件一起工作。API帮助手册中有关于不同Layout组件的列表。一个Appender 对象,只能对应一个Layout对象。要实现你自己的Layout类,你需要从https://www.360docs.net/doc/c34067434.html,youtSkeleton类继承,它实现了ILayout接口。

3 在程序中使用log4net

在开始对你的程序进行日志记录前,需要先启动log4net引擎。这意味着你需要先配置前面提到的三种组件。你可以用两种方法来设定配置:在单独的文件中设定配置或在代码中定义配置。

因为下面几种原因,推荐在一个单独的文件中定义配置:

l 你不需要重新编译源代码就能改变配置;

2 你可以在程序正运行的时候就改变配置。这一点在一些WEB程序和远程过程调用的程序中有时很重要;

考虑到第一种方法的重要性,我们先看看怎样在文件中设定配置信息。

3.1定义配置文件

配置信息可以放在如下几种形式文件的一种中。

在程序的配置文件里,如AssemblyName.config 或web.config.

在你自己的文件里。文件名可以是任何你想要的名字,如AppName.exe.xyz等.

log4net框架会在相对于AppDomain.CurrentDomain.BaseDirectory 属性定义的目录路径下查找配置文件。框架在配置文件里要查找的唯一标识是标签。一个完整的配置文件的例子如下:

你可以直接将上面的文本拷贝到任何程序中使用,但是最好还是能够理解配置文件是怎样构成的。只有当你需要在应用程序配置文件中使用log4net配置时,才需要在标签中加入

配置节点入口。对于其他的单独文件,只有标签内的文本才是必需的,这些标签的顺序并不是固定的。下面我们依次讲解各个标签内文本的含义:

3.1.1

在框架的体系里,所有的日志对象都是根日志(root logger)的后代。因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过标签定义日志对象使用的Appender对象。声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定标签的additivity属性为false而改变。

Additivity的值缺省是true.

1

2

3

3.1.2

元素预定义了一个具体日志对象的设置。然后通过调用LogManager.GetLogger(“testAPP.Logging”)函数,你可以检索具有该名字的日志。如果LogManager.GetLogger(…)打开的不是预定义的日志对象,则该日志对象会继承根日志对象的属性。知道了这一点,我们可以说,其实标签并不是必须的。

3.1.3

标签或单个的标签里的Appender对象可以用标签定义。标签的基本形式如上面所示。它定义了appender的名字和类型。另外比较重要的是标签内部的其他标签。不同的appender有不同的标签。在这里,为了使用FileAppender,你需要一个文件名作为参数。另外还需要一个在标签内部定义一个Layout对象。Layout对象定义在它自己的标签内。标签的type属性定义了Layout的类型(在本例里是PatternLayout),同时也确定了需要提供的参数值。Header 和Footer标签提供了一个日志会话(logging session)开始和结束时输出的文字。有关每种appender的具体配置的例子,可以在log4net\doc\manual\example-config-appender.html中得到。

type="log4net.Appender.FileAppender" >

3.1.4 https://www.360docs.net/doc/c34067434.html,yout.PatternLayout中的转换模式(ConversionPattern)

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息

%n(new line):换行

%d(datetime):输出当前语句运行的时刻

%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数

%t(thread id):当前语句所在的线程ID

%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等

%c(class):当前日志对象的名称,例如:

模式字符串为:%-10c -%m%n

代码为:则输出为下面的形式:

ILog log=LogManager.GetLogger(“Exam.Log”);

log.Debug(“Hello”);

Exam.Log - Hello

%L:输出语句所在的行号

%F:输出语句所在的文件名

%-数字:表示该项的最小长度,如果不够,则用空格填充

例如,转换模式为%r [%t]%-5p %c - %m%n 的PatternLayout 将生成类似于以下内容的输出:

176 [main] INFO org.foo.Bar - Located nearest gas station.

3.1.5

最后,让我们看看在Appender元素里的标签。它定义了应用到Appender对象的过滤器。本例中,我们使用了LevelRangeFilter过滤器,它可以只记录LevelMin和LevelMax参数指定的日志级别之间的日志事件。可以在一个Appender上定义多个过滤器(Filter),这些过滤器将会按照它们定义的顺序对日志事件进行过滤。其他过滤器的有关信息可以在log4net 的SDK文档中找到。

3.2使用配置文件

3.2.1 关联配置文件

当我们创建了上面的配置文件后,我们接下来需要把它和我们的应用联系起来。缺省的,每个独立的可执行程序集都会定义它自己的配置。log4net框架使用log4net.Config.DOMConfiguratorAttribute在程序集的级别上定义配置文件。

例如:可以在项目的AssemblyInfo.cs文件里添加以下的语句

[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",

ConfigFileExtension="ext",Watch=true/false)]

ConfigFile:指出了我们的配置文件的路径及文件名,包括扩展名。ConfigFileExtension:如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。

Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名,删除等事件。

其中:ConfigFile和ConfigFileExtension属性不能同时使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”

ConfigFileExtension则是指明了和可执行程序集同名的配置文件的扩展名,例如,应用程序

的名称是”test.exe”,ConfigFileExtension=”txt”,则配置文件就应该是”test.exe.txt”;

也可以不带参数应用DOMConfiguratio():

[assembly: log4net.Config.DOMConfigurator()]

也可以在程序代码中用DOMConfigurator类打开配置文件。类的构造函数需要一个FileInfo 对象作参数,以指出要打开的配置文件名。这个方法和前面在程序集里设置属性打开一个配置文件的效果是一样的。

log4net.Config.DOMConfigurator.Configure(new FileInfo("TestLogger.Exe.Config"));

DOMConfigurator 类还有一个方法ConfigureAndWatch(..), 用来配置框架并检测文件的变化。

以上的步骤总结了和配置相关的各个方面,下面我们将分两步来使用logger对象。

3.2.2 创建或获取日志对象

日志对象会使用在配置文件里定义的属性。如果某个日志对象没有事先在配置文件里定义,那么框架会根据继承结构获取祖先节点的属性,最终的,会从根日志获取属性。如下所示:

Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");

3.2.3 输出日志信息

可以使用ILog的几种方法输出日志信息。你也可以在调用某方法前先检查IsXXXEnabled 布尔变量,再决定是否调用输出日志信息的函数,这样可以提高程序的性能。因为框架在调用如ILog.Debug(…)这样的函数时,也会先判断是否满足Level日志级别条件。

if (log.IsDebugEnabled) log.Debug("message");

if (log.IsInfoEnabled) https://www.360docs.net/doc/c34067434.html,("message);

3.3在程序中配置log4net

除了前面讲的用一个配置文件来配置log4net以外,还可以在程序中用代码来配置log4net 框架。如下面的例子:

//和PatternLayout一起使用FileAppender

尽管这里用代码配置log4net也很方便,但是你却不能分别配置每个日志对象。所有的这些配置都是被应用到根日志上的。

log4net.Config.BasicConfigurator.Configure(new log4net.Appender.FileAppender(

new https://www.360docs.net/doc/c34067434.html,yout.PatternLayout("%d [%t]%-5p %c [%x] - %m%n"),"testfile.log"));

using a FileAppender with an XMLLayout

log4net.Config.BasicConfigurator.Configure(new log4net.Appender.FileAppender(

new https://www.360docs.net/doc/c34067434.html,yout.XMLLayout(),"testfile.xml"));

// using a ConsoleAppender with a PatternLayout

log4net.Config.BasicConfigurator.Configure(new log4net.Appender.ConsoleAppender(

new https://www.360docs.net/doc/c34067434.html,yout.PatternLayout("%d [%t] %-5p %c - %m%n")));

// using a ConsoleAppender with a SimpleLayout

log4net.Config.BasicConfigurator.Configure(new log4net.Appender.ConsoleAppender(new

https://www.360docs.net/doc/c34067434.html,yout.SimpleLayout()));

log4net.Config.BasicConfigurator 类使用静态方法Configure 设置一个Appender 对象。而Appender的构造函数又会相应的要求Layout对象。你也可以不带参数直接调用BasicConfigurator.Configure(),它会使用一个缺省的PatternLayout对象,在一个ConsoleAppender中输出信息。如下所示:

log4net.Config.BasicConfigurator.Configure();

在输出时会显示如下格式的信息:

0 [1688] DEBUG log1 A B C - Test

20 [1688] INFO log1 A B C - Test

当log4net框架被配置好以后,就可以如前所述使用日志功能了。

4 总结

使用log4net可以很方便地为应用添加日志功能。应用Log4net,使用者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。

程序里使用,你可以按照这样的步骤:

1.添加log4net引用

2.为项目新增一个文件,选取新增向导里的"应用程序配置文件",则项目里会增加一个app.config文件.当程序编译后,会在你的执行目录下生成一个<你的程序集名>.exe.config文件内容和本文件一样

3.编辑app.config文件如下:

这里请注意标签不能少

4.编辑Assembly.cs文件,添加如下内容:

[assembly:log4net.Config.DOMConfigurator( ConfigFileExtension="config",Watch=true)]

5.在程序里添加如下代码

log4net.ILog log = log4net.LogManager.GetLogger("MyLogger");

log.Debug("test");

这时你再运行程序,就应该可以看到结果了,我试过如果设置

level = "OFF",则输出是没有结果的,改成"ALL"是有结果的

log4net配置及使用

第一步:在项目引用log4net.dll文件 第二步: 在Web.config文件中加入一句代码,位置如下:

第三步: 建立一个单独的配置文件,文件名为:log4net.config (这个配置文件会在App_Data目录下按日期每天产生一个日志文件,如:Logs_20090703.txt) log4net.config配置文件内容:

.Net中日志管理

.Net中日志管理 Start:2011.04.25 Updated:2011.04.28 王凡(wangfan) wf141732@https://www.360docs.net/doc/c34067434.html, woshiwangfan@https://www.360docs.net/doc/c34067434.html, https://www.360docs.net/doc/c34067434.html,/lingmengfei 1.简介 1.1.简介 记录.net 1.2.环境信息 VS:2010 SQLSERVER:2008SP2 1.3.相关文档 《https://www.360docs.net/doc/c34067434.html,初探》 2.日志 在大型的项目中日志是非常重要的,在这里我们引入java下非常有名的log4j的.net版 log4net.

2.1.准备 Log4net是apache的开源项目,到https://www.360docs.net/doc/c34067434.html,/log4net/找到最新的源文件下载 下载完成后使用vs打开编译,生成log4net.dll 2.2.引用用log4net 在建立的项目中添加引用 找到生成的dll位置 2.3.配置log4net 配置信息可以放在如下几种形式文件的一种中。 在程序的配置文件里,如AssemblyName.config 或web.config。

在你自己的文件里。文件名可以是任何你想要的名字,如AppName.exe.xyz等。 log4net框架会在相对于AppDomain.CurrentDomain.BaseDirectory 属性定义的目录路径下查找配置文件。框架在配置文件里要查找的唯一标识是标签。一个完整的配置文件的例子如下:

.Net 明日科技ERP程序使用说明

企业ERP管理系统使用说明书配置源程序 附加数据库SQL Server 2005 (1)将Database文件夹中的两个文件拷贝到SQL Server 2005安装路径下的MSSQL.1\MSSQL\Data文件夹中。 (2)打开SQL Server 2005,然后展开本地服务器,在“数据库”数据项上单击鼠标右键,在弹出的快捷菜单中选择“附加”菜单项。 (3)将弹出“附加数据库”对话框,在该对话框中单击“”按钮,选择所要附加数据库的.mdf文件,单击“确定”按钮,即可完成数据库的附加操作。 使用说明 系统介绍 本系统属于中小型企业ERP管理系统,可以对中小型生产企业或商业企业进行有效管理。通过本系统可以达到以下目标: ●灵活的录入数据,使信息传递方便、快捷; ●系统采用人机交互方式,界面美观友好,操作灵活方便,业务流程控制严谨,数据 存储安全可靠; ●严格按操作功能来分配权限; ●严格控制业务流程,主动向用户提示业务流程信息; ●各种单据的最终确认,需要具有审核权限的人员进行审核操作; ●客户分析采用图形化显示,直观明了; ●实现各种综合查询和模糊查询; ●实现企业客户及其内部资源的信息集成化管理; ●对用户输入的数据,进行严格的数据检验,尽可能避免人为错误; ●系统最大限度地实现了易维护性和易操作性。 操作注意事项 (1)本系统管理员用户名为:mr,密码为:mrsoft。

(2)实例执行文件位置:SMALLERP\bin\Debug\ SMALLERP.exe。 操作流程 (1)用户输入用户名及密码进入企业ERP管理系统界面,如图1.1所示。 图1.1 企业ERP管理系统界面 (2)单击“采购管理”/“采购订单”菜单项,录入企业购买原材料的订单信息,主要包括存货名称、采购单价、采购数量和审核状态等信息,如图1.2所示。

Log4记录日志使用说明

一、 想要让Log4net日志(以下称日志)按每月自动归类为一个文件夹,为此,学习和修改了log4net.config文件。查了资料,重点是以下这些参数: 众说纷纭,许多说得让人看后似懂非懂,经过说起来都是泪的实验,终于有了明确的结论,整理发表出来避免后人走弯路。 1.StaticLogFileName的值如果为true,则当前日志文件(相对于历史日志文件而言)的文件名只取File参数。如果为false,则文件名取File+DatePattern。 2.File的值是静态的如果写“yyyy-MM”就是“yyyy-MM”而不会转成当前的年份和月份,而且斜扛“/”与反斜扛“\”效果相同,连续2扛也与1扛相同。 3.DatePattern的值是动态的“yyyy”代表4位年份,详细参考网上的众多资料(这个不难得到)。如果想表达静态的字符(如“y”)有2种办法,1是使用转义字符“\”,即“\y”,2是使用一对单引号限定,即“'y'”。如上面的value="_yyyy-MM-dd.'config'",就是因为fig有特殊含义,所以把“config”用单引号包含起来了。 4.修改了(网站上的)log4net.config文件,使它生效的方法是重启网站(我没有试着去操作应用程序池)。实测重启网站有约10%没有使它生效,但如果是先停止网站再启动,则100%生效。 以上4点最关键是第1点,也是众多资料所没有说清楚的(本人的汉字理解能力有问题?)。最终符合我要求的配置如下: 以上是基于我自己做的实验而得出的结论,难免不够系统和全面,限于本人水平,难免有错误。如有发现错漏,欢迎指正。 二、 log4net配置文件设置 2011-11-16 13:15:41| 分类:Notes|举报|字号订阅

log4net使用手册

log4net使用手册 1 简介 1.1Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。 经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。 Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。 1.2Log4net的安装: 用户可以从https://www.360docs.net/doc/c34067434.html,/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可。 2 Log4net的结构 log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及Layout(布局). 2.1Logger 2.1.1 Logger接口 Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。 Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.c和a.b,那么我们说a.b是a.b.c的祖先。每一个logger 都继承了祖先的属性 Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口。你可以参考在/extension目录下的几个例

IIS 下.net环境的安装与配置(V1.0)

IIS 6.0下.net环境的安装与配置(V1.0) 一、.NET Framework程序安装 1、官方下载: Microsoft Microsoft .NET Framework 1.1 版简体中文语言包,点击下载; Microsoft .NET Framework 2.0 版简体中文语言包 (x86),点击下载; 2、程序安装: ①NET Framework 1.1安装 .NET Framework 1.1可以有两种安装方法:一是使用官方安装程序直接安装;二是根据server2003自带.net 1.1组件安装的形式安装;我们先按第二种方法来安装.net 1.1;第一种方法参考后面的.NET Framework 2.0安装,如下: A、从“开始”菜单中,单击“管理您的服务器”;在“管理您的服务器”窗口中,单击“添加或删除角色”,如图: B、在“配置您的服务器向导”中,单击“下一步”,并在“服务器角色”对话框中,选中“应用程序服务器(IIS、https://www.360docs.net/doc/c34067434.html,)”,然后单击“下一步”,如图:

C、在“应用程序服务器选项”对话框中,选中“启用https://www.360docs.net/doc/c34067434.html,”复选框,单击“下一步”,然后再单击“下一步”,如图:

D、如有必要,请将 Windows Server 2003 安装 CD 插入 CD-ROM 驱动器(或浏览到Server 2003安装文件目录i386),找到相应资源后,然后单击“下一步”,如图: 数据复制完成后,安装完成;重新启动IIS后配置生效。 ②NET Framework 2.0安装 双击下载的dotnetfx.exe安装程序,开始安装,如下: A、接受“最终用户许可协议”,点“安装”:

Log4net使用说明

Log4net使用说明: 简单说明下log4net的使用方法, 0. 确认在/bin下有log4net.dll和log4net.xml文件 1. 在Global.asax.cs的Application_Start 方法中添加 System.IO.FileInfo info = new System.IO.FileInfo(Server.MapPath(HttpContext.Current.Request.ApplicationP ath) + System.Configuration.ConfigurationSettings.AppSettings["LogConfigPath"]); DOMConfigurator.Configure(info); 在ChinaGCG的web.config结点中添加 其中的value为你的log4net参数配置文件 这样我们的系统就知道从哪里去找到这个配置文件了 2 . 在根目录(ChinaGCG)下建立log4net.properties文件 以下是example

.NET开发环境安装配置说明

.NET开发环境安装配置说 明

1 目的 本文档用于指导.NET 方向实训员工安装开发环境,包括visual studio 2008、MSDN 、SQLSERVER 2005、Visual.SourceSafe 2005的安装及注意点。 2 安装说明 2.1 安装准备 系统要求:Windows Server 2003/ Windows XP ,IIS6.0; 安装文件:Visual Studio 2008、MSDN 、SQLSERVER 2005、Visual.SourceSafe 2005。 2.2 安装软件存放位置 序号 名称 安装目录 1 Visual Studio 2008 \\172.1.41.15\soft\VS2008 2 Sqlserver2005 \\172.1.41.15\soft\SQL2005 3 Visual.SourceSafe 2005 \\172.1.41.15\soft\vss2005 本文档所述软件存放于局域网上名为“\\172.1.41.15”的机器上,用户可以在浏览器的地址上或者开始->运行里面输入下述命令,按回车键后进入该机器: 在提示输入用户名与密码时,分别输入a 、ambow 。 2.3 Visual Studio 2008及MSDN 安装说明 注意:安装这两个程序的安装盘符要保证有7G 的空间。 (1)进入Visual Studio 2008的安装目录,双击setup.exe ,进入安装程序,点击安装Visual Studio 2008,如下图:

(2)点击下一步,如下图: (3)选中我已阅读并接受许可条款并点击下一步,如下图:

用C#.NET实现完整文档打印功能

用C#实现完整文档打印功能 在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .net Framework的打 印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下。 打印操作通常包括以下四个功能 1 打印设置设置打印机的一些参数比如更改打印机驱动程序等 2 页面设置设置页面大小纸张类型等 3 打印预览类似于word中的打印预览 4 打印 下面我把我编写的记事本(全部源代码可以在https://www.360docs.net/doc/c34067434.html,中下载)中用到的打印功能的代码进行解释希望能给大家一些帮助 实现打印功能的核心是PrintDocument类这个类属于System.Drawing.Printing 名字空间这个类封装了当前的打印设置页面设置以及所 有的与打印有关的事件和方法 这个类包括以下几个属性事件和方法 1、PrinterSettings 属性 存放打印机的设置信息这个属性不需要程序员设置因为它是由打印对话框获取的 2、PrintCountroller 属性 控制打印过程 3、DefaultPageSettings 属性 存放页面设置信息打印纸大小方向等也不需要程序员设置因为它是由页面设置对话框获取的 4、DocumentName 属性 指定文档名称,出现在打印机状态窗口中 1。BeginPrint事件 在打印之前发出 2. PrintPage事件 每打印一页是发出,事件接受一个PrintPageEventArgs参数该参数封装了打印相关的信息 PrintPageEventArgs参数有很多重要的属性 1 Cancel 取消打印 2 Graphics 页面的绘图对象 3 HasMorePages 是否还有要打印的页面 Print 方法该方法没有参数调用它将按照当前设置开始打印 若实现打印功能首先构造PrintDocument对象添加打印事件 PrintDocument printDocument; private void InitializeComponent() {

.Net反编译技术详解及4个反编译工具介绍

.Net反编译技术详解及4个反编译工具介绍 Net反编译技术详解及4个反编译工具介绍什么是反编译?高级语言源程序经过编译变成可执行文件,反编译就是逆过程。即通过技术手段将可执行文件还原成源代码。此文讲解如何将.net(c#、F#、https://www.360docs.net/doc/c34067434.html,)编写的可执行文件还原成c#代码。了解.net(c#)的编译过程C#源代码经过编译器的编译之后,变成MSIL微软中间语言。其实也就是一个可执行文件,也可以叫做程序集(.exe文件)。注意:不是所有的exe文件都叫程序集,这个文件是由微软中间语言组成的才叫程序集。当程序被执行时,微软中间语言(程序集)将被CLR翻译成平台对应的CPU指令,然后交给CPU执行。注意:CPU的指令并不是相同的,不同平台的CPU指令可能有比较大的区别。如:Intel和AMD在开机或者关机的时候Intel可能为111 而AMD可能为000。不同型号的CPU 指令也可能有区别。如:四核和双核。C#代码的编译过程如下图所示:c#反编译过程:反编译过程即将.net 程序集转换成IL中间语言,然后再将IL转为c#代码。还原率接近90%。反编译工具介绍:说到.net 反编译工具,很多人第一反应都是Reflector这款神器。但是我呢认为这是个垃圾软件,为什么呢,因为他收费啊,而且没有什么特别出众的功能,所以本文不加以介绍。本文主要介绍ILSpy、dnSpy、JetBrains和

Telerik JustDecompile以及可直接修改程序集的reflexil插件和脱壳反混淆的de4Dot插件。文本的示例程序:特意用c#写了一个checkMe程序,用来展示说明以下各个工具的功能。程序很简单,一个登陆框,输入对的密码即可显示主窗体,显示一个“今日头条很伟大”的字样.checkMe1、ILSpy:ILSpy是一个开源免费的.Net反编译软件,基于MIT 许可证发布。作者在工作中使用最频繁的就是它。,ILSpy 是为了完全替代收费的Reflector而生,它是由iCSharpCode 团队出品,这个团队开发了著名的SharpDevelop 。ILSpy 的使用和上面的Reflector完全类似,可以直接把dll、exe 拖放到左侧,然后在右侧查看反编译以后的代码。ilSpy另外ILSpy支持插件,比如使用Debugger插件可以进行调试,使用reflexil插件可以直接修改程序集。支持类、函数、变量、字符串等多种搜索。以上的示例程序,使用ILSpy查找登陆密码如下:ilSpy2、dnSpydnSpy是近几年的新秀,功能远比ILSpy强大,甩Reflector几条街。被汉化、破解、逆向方面的人才奉为神器。软件自带调试和修改程序集的功能dnSpydnsyp功能菜单dnspy可直接调试修改程序集。可添加修改类、方法、变量等。可操作合并程序集、禁用内存映射。可在16进制编辑器中直接定位方法体、字段。也可以16进制编辑器中直接修改方法和字段。更多强大的功能亲们自己下载dnspy摸索体验一下下面我们使用dnspy来调试一

NetIQ Chariot快速使用手册

NetIQ Chariot快速使用手册 目录 1 Chariot工作原理 (2) 2 安装 (2) 2.1 Console (2) 2.2 Endpoint (2) 3 经验配置 (3) 4 开始测试 (4) 4.1 使用步骤 (4) 4.2 脚本分析 (6) 4.3 生成自己的测试脚本 (7) 4.4 测试结果分析 (9) 4.4.1 运行过程 (9) 4.4.2 发送速率 (9) 4.4.3 时延 (10) 4.4.4 丢包 (10) 4.4.5 抖动 (11) 5 有效带宽测试 (11) 6 组播测试 (11) 6.1 关于组播 (11) 6.2 组网 (12) 6.3 测试步骤 (12) 6.4 Chariot组播测试的不足 (13) 6.4.1 测试前的设置 (13) 6.4.2 可能缺陷之一 (14) 6.4.3 可能缺陷之二 (15) 6.4.4 结论 (15) 7 防火墙 (15)

NetIQ Chariot快速使用手册 1Chariot工作原理 控制端Console为该产品的核心部分,控制界面(也可采用命令行方式)、测试设计界面、脚本选择及编辑、结果显示、报告生成以及API 接口提供等都由控制端提供。 Endpoint 根据实际测试的需要,安装在单个或者多个终端处,负责从控制端接收指令、完成测试并将测试数据上报到控制端。 测试范围:可以点到点、点到多点、多点到多点、组播,连接可多达一万对。 2安装 Chariot Console是一个32位的Windows应用,可以运行在以下四种操作系统平台:Windows Me 、Windows NT 、Windows 2000 、Windows XP (32-bit only)。 注意:安装软件的机器不能配置太低,否则测试软件可能无法正常运行。 2.1 Console 在一台计算机上安装Console,该计算机上可同时安装Endpoint。 运行Chariot_inst服务器安装程序,选择安装默认路径,直到安装结束。 2.2 Endpoint 必须在被测试网络的远端安装Endpoint。本地可以与Console安装在同一台计算机上。 有两种Endpoint可供选择:GSENDW32.EXE,需要安装,安装后永远保存,开机服务自动运行;另一个是endpoint.exe,双击运行,下次开机需要重新运行。

动软.Net代码生成器使用文档

自动生成C#代码 功能介绍 一键自动生成各种C#代码,可以节省大量的时间来做业务逻辑的代码,那些重复的代码就交给它去做吧,1分钟生成一个架构所有的基本代码。有了它开发项目的效率简直轻松多了。 ?可以生成3种不同架构的代码:简单三层结构;基于工厂模式三层架构;自定义结构模版 ?可以生成页面Html代码和页面.cs处理代码 ?支持父子表的(事务)的代码生成 ?可以自定义选择生成的字段 ?可以自由设定命名空间和实体类名 ?自动生成方法属性注释 ?支持对表和视图的代码生成 ?支持对多种类型数据库生成代码:如SQLServer2000/2005,Oracle,OleDb等 ?可以生成3种不同类型数据层: 基于SQL字符串方式,基于Parameter方式和基于存储过程方式的数据层 数据库服务器管理 类似SQLServer2005的管理界面,方便平常在代码编辑的时候想查看数据库的信息,并且可以很直观的查看字段类型,长度,主键,默认值等详细信息,省去了在代码和数据库管理器之间的来回切换,方便快捷。 ?可支持SQL Server2000/2005、Oracle、OleDb三种类型的数据库同时管理。 ?可以轻松浏览库,表,视图,存储过程的结构信息. ?可以查看存储过程和视图的定义脚本。 ?表的重命名,删除操作。

查询分析器 实现类似SQLServer2005的查询分析器的功能,方便编写代码时想进行数查询。 ?实现执行选中部分SQL语句。 ?实现关键字高亮。 ?支持F5快捷键执行语句。 ?实现打开现有脚本,保存当前脚本功能。 ?实现错误检测提示功能。 自动生成存储过程和SQL脚本 ?可以自动生成表的创建脚本。 ?可以自动生成表数据的插入脚本。 ?可以自动生成增、删、改、查等操作的存储过程脚本。 ?可以根据选定的数据库和表,进行多选批量生成。 ?支持在当前生成和导出脚本文件功能。 自动生成数据库文档 可以根据选定的数据库和表(可批量生成),可以生成字段的详细信息,包括默认值,描述等信息.生成相应的表结构文档,免去手工写文档和操作的麻烦。 Web项目文件发布

Log4Net之记录日志到文档详解

前面一章、我们简单的介绍了log4net的功能,以及一个记录日志到文档的案例。 本节、将带领大家详细了解上节案例中各行代码的意思。 首先是配置log4net.config 节点。这是config文件必须切只能包含一个的,用来包含所有的配置内容。 节点。这是用来为配置文件添加自定义节点的。它的内容

代表着想这个配置文件添加一个用户自定义节点,节点的名称为log4net类型。IgnoreSectionHandler表示创建的节点类型。这个类型的简单介绍为:创建新的配置处理程序并将指定的配置对象添加到节处理程序集合中 节点。这个节点是根日志节点,其内容为根日志的配置,有level级别值和Appender的列表。所有的子用户节点()都是其后代,上节代码中没有使用节点。它的内容代表着根节点日志记录的日志等级是记录所有等级的日志,标签定义日志对象使用的Appender对象。声明了在其他地方定义的Appender对象的一个引用。 日志的等级分为以下几种:ERROR、WARN、INFO、DEBUG,ALL ERROR 为严重错误主要是程序的错误 WARN 为一般警告,比如session丢失 INFO 为一般要显示的信息,比如登录登出 DEBUG 为程序的调试信息 则声明了你的log4net日志的保存方法等其他信息。上章的代码中日志的保存方法为“写日志到文件”所有appender的type则是RollingFileAppender。 则是设置appender的属性,如保存的文件名,记录方式等, 输出日志的格式化器,用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示 格式名含义 %c输出日志信息所属的类的全名 %d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-ddHH:mm:ss},输出类似:2002-10-18-22:10:28 %f输出日志信息所属的类的类名 %l输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 %m输出代码中指定的信息,如log(message)中的message %n输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” %p输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推 %r输出自应用启动到输出该日志信息所耗费的毫秒数 %t输出产生该日志事件的线程名 其次是引入log4net.config文件到你的项目中去 想将你的项目引入到log4net,你的将你刚刚配置的log4net.config文件引入到你的项目中来: 1、在项目中找到AssemblyInfo.cs文件,向文件的最后一行加入代码:

Log4net入门介绍

Log4net入门介绍 1 简介 1.1Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。 经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。 Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。 1.2Log4net的安装: 用户可以从https://www.360docs.net/doc/c34067434.html,/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可。 2 Log4net的结构 log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appen der(附着器)以及 Layout(布局)。 2.1Logger 2.1.1 Logger接口 Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。 Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.c和a.b,那么我们说a.b是a. b.c的祖先。每一个logger都继承了祖先的属性。 Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口。你可以参考在/extension目录下的几个例子。

Microsoft .NET Framework 4安装说明

https://www.360docs.net/doc/c34067434.html, Framework4自述文件 有关最新版本的自述文件,请单击此处。 1.系统要求 1.1.支持的体系结构 1.2.支持的操作系统 1.3.硬件要求 1.4.其他系统要求 2.已知问题 2.1.安装 2.1.1.Full Framework(安装) 2.1.2.Client Profile(安装) 2.2.卸载 2.2.1.Full Framework(卸载) 2.2.2.Client Profile(卸载) 2.3.产品问题 2.3.1.一般问题 https://www.360docs.net/doc/c34067434.html, 2.3.3.Winforms 2.3.4.并行编程 2.3.5.Managed Extensibility Framework 2.3.6.Entity Framework 2.3.7.LINQ to SQL 2.3.8.Windows Communication Foundation(WCF) 2.3.9.Windows Presentation Foundation(WPF) 2.3.10.Windows Workflow Foundation(WF) 2.3.11.Client Profile(产品) 3.相关链接 1.系统要求 1.1支持的体系结构 x86 x64 ia64(有些功能在诸如Windows Presentation Foundation(WPF)之类的ia64上不受支持) 1.2支持的操作系统 Windows XP SP3 Windows Server2003SP2 Windows Vista SP1 Windows7 Windows Server2008(在Server Core角色上不受支持) Windows Server2008R2(在Server Core角色上不受支持) 1.3硬件要求

log4net日志信息保存到Oracle数据库

使用说明一:下载log4net.dll 将log4net.dll拷贝到bin下面,并添加对它的引用二:在数据库里面创建表Log create table LOG ( LOGDA TE V ARCHAR2(20), LOG_LEVEL V ARCHAR2(255), LOGGER V ARCHAR2(255), MESSAGE V ARCHAR2(2000), EXCEPTION V ARCHAR2(2000) ) 三:配置Web.config 注意2个地方: 1:在configSections加入相关代码 2:log4net里面对数据库连接进行配置

四:程序调用 1:创建一个辅助类:SystemLog.cs 2: 创建Global.asax,里面设置相关代码 void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 PDAManage.SystemLog.SetConfig(); } 3:在页面中调用:

注意: 1:Web.config配置问题 应删除或屏蔽以下代码,否则会产生2条日志记录!!!

2:读取WebConfg问题: 网上都建议在globe.ascx里面: void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 PDAManage.SystemLog.SetConfig(); } 但发现一个问题:第二次访问某页面的时候,不能成功保存到数据库1:所有页面继承basePage 2:在BasePage里面加上:

一步一步教你玩转.NET_Framework的配置文件app.config

一步一步教你玩转.NET Framework的配置文件app.config 在一般的项目中,为了使你的代码更加灵活,更方便调整,减少不必要的hard code,我们都在config中添加许多配置信息,一般可以选择.NET自带的配置文件形式app.config或者web 项目中的web.config来完成配置工作。 .NET中提供了几个和配置有关的类来支持用完轻松的完成配置文件的读写设置: System.Configuration.ConfigurationSectionGroup 一般和你项目中使用的Assambly保持1:1的对应关系,这样划分使得结构相对清晰,权责明确。当然你可以不使用它,这样一旦你的Assambly在别的地方要被重用时,找出相应的config信息就变得很困难。 System.Configuration.ConfigurationSection 维护一个相对独立的配置节,使用时需现在节点下声明。我们熟悉的以及 就是.NET为我们预留的一个Section。System.Configuration.ConfigurationElementCollection & System.Configuration.ConfigurationElement 就是Section下具体的配置信息和配置信息的集合了。 下面来看看怎么使用这些类玩转app.config 1.初级玩法 最初级的用法当然是使用,我们在app.config 中添加 访问它 public class AppSettingConfig { public string resultValue; public AppSettingConfig() { this.resultValue = ConfigurationManager.AppSettings["MyConfigString"].ToString(); } } [TestMethod] public void TestAppSettingConfigNode() { AppSettingConfig appCon = new AppSettingConfig(); Assert.AreEqual("Test Config Data", appCon.resultValue); }

.Net明日知道网站程序使用说明

仿百度知道之明日知道使用说明书 配置源程序 附加数据库SQL Server 2005 (1)将TM\09\App_Data文件夹中的扩展名为db_WL_Data.MDF和db_WL_Log.LDF的两个文件拷贝到SQL Server安装路径下的Data文件夹中。 (2)打开SQL Server 2005,在“数据库”数据项上单击鼠标右键,在弹出的快捷菜单中选择“附加…”菜单项。 (3)将弹出“附加数据库”对话框,在该对话框中单击【】按钮,选择所要附加数据库的db_WL_Data.MDF文件,单击【确定】按钮,即可完成数据库的附加操作。 配置IIS (1)依次选择“开始”/“设置”/“控制面板”/“管理工具”/“Internet信息服务(IIS)管理器”选项,弹出“Internet信息服务(IIS)管理器”窗口,如图1.1所示。 图1.1 “Internet信息服务(IIS)管理器”窗口 (2)选中“默认网站”节点,单击右键,选择“属性”,如图1.2所示。

图1.2 选择“属性”菜单项 (3)弹出“默认网站属性”对话框,如图1.3所示,单击“网站”选项卡,在“IP地址”下拉列表中选择本机IP地址。 图1.3 默认网站属性 (4)单击“主目录”选项卡,如图1.4所示。单击“浏览”按钮,弹出“浏览文件夹”对话框,选择您的网站路径,单击【确定】按钮。

图1.4 “主目录”选项页 (5)选中首页文件,单击鼠标右键,在弹出的菜单中选择“浏览”菜单项 使用说明 系统介绍 通过深入广泛的分析、实际调研,根据明日知道网站要求主要实现一下目标: ●分为前台操作和后台管理两个网站; ●前台网站的主要功能是分类管理各个编程语言的相关知识; ●提问者可以发布某一编程语言的问题,回复者给出答案; ●提问者在众多答案中评选最佳答案,被评为最佳答案的回复者可以获得规定的积分奖励; ●如果没有正确的答案,提问者可以关闭该问题; ●用户可以在前台网站的搜索引擎中查找待解决或自已感兴趣的各个编程语言问题及最佳 答案; ●后台管理网站的主要功能是对用户提出的问题进行管理及用户相关信息(如积分、获得 最佳答案数等)的查询。 操作注意事项 (1)本系统管理员用户名为:mr,密码为:mrsoft。 操作流程 在明日知道首页中使用网站内提供的搜索引擎查找主题或内容中包含指定关键字的问题列表,其实际运行效果如图1.5所示。

相关文档
最新文档