




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C#发现之旅 - C#开发Windows Service程序本课程说明了Windows Service程序的概念,并演示如何使用C#开发一个简单的Windows Service程序。C#工程名为MyWindowsService,编译生成的文件是MyWindowsService.exe。本课程的演示代码下载地址为Windows Service概念介绍Windows Service,也称Windows服务,是32位Windows操作系统中一种长期运行的后台程序。它们长期后台运行,没有用户界面,默默无闻,但它们却是支持Windows正常运行的幕后英雄,却永无出头之日。Windows服务程序为其他系统
2、模块提供了非常重要的服务,而且各个Windows服务分工明确,比如IISAdmin服务提供WEB内容的发布功能,若IISAdmin服务不启动,则静态HTML页面、ASP、ASP.NET或者WebService等等统统不行;有个名为“Print Spooler”的服务用于提供打印支持,若该服务不启动,则任何软件都不能进行打印,比如Word,记事本或者报表软件等等。Windows启动后在没有用户登录时就会启动Windows服务。Windows NT和Windows2000,以及更新的版本操作系统能运行Windows服务,但Windows98及其前期版本是不能运行服务的。我们打开Windows资源管
3、理器,在左边的树状列表中选中“桌面-控制面板-管理工具”。 在右边的列表中打开“服务”项目即可打开Windows服务管理器。 在这些服务中,有我们最熟悉的IIS Admin和World Wide Web Publishing服务了。我们双击一个服务项目即可打开服务属性对话框。 Windows服务有一个服务名称属性,该属性是服务的惟一的不可重复的名称,我们可以在命令行中使用命令“net start 服务名称”来启动服务,使用“net stop 服务名称”来停止服务。Windows服务的启动类型有自动,手动和已禁用。当启动类型为自动时,Window
4、s启动后不等用户登录就自动启动服务,当启动类型为手动时,需要某个操作员登录后点击这里的“启动”按钮来启动服务,而当启动类型为已禁用时,Windows服务不能启动。该页面中的“启动”按钮用于启动尚未启动的Windows服务,运行提供服务的进程;“停止”按钮用于停止已经启动的服务,杀死服务进程;而“暂停”按钮用于通知服务进程暂时停止提供服务,但服务进程依然存在;而“恢复”按钮用于通知处于暂停模式的服务进程重新提供服务。 我们可以查看服务属性对话框的“登录”页面。 可以指定服务使用本地系统帐户登录,也可另外指
5、定其他的用户,这里有一个允许服务和桌面交互的选项,若选中此选项,则Windows服务可以显示图形化用户界面,比如显示自己的窗体,显示消息框等等。不过不建议使用该选项,而且Windows服务运行时不要显示图形化用户界面。我们切换到“依存关系”页面,可以看到本服务和其他服务的依存关系。 各个Windows服务之间可能存在依赖关系,比如IISADMIN服务就依赖另外一个名为RPC的Windows服务,当启动一个Windows服务时,系统会启动该服务所依赖的其他Windows服务。例如我们设置IISADMIN服务为自动启动,而RPC服务为手动启动,则Windows启动后会试图自动启动IISA
6、DMIN服务,结果会首先启动RPC服务,即使RPC服务不是自动启动。若RPC服务为禁止,无论如何也不能启动,则IISADMIN服务就无法自动启动了。C#编写Windows服务的基本过程编写Windows服务是一种比较高级的编程技术,内部使用了很多Windows操作系统的核心功能,但微软.NET框架已经很好的封装了这些技术细节,使得我们可以很方便的使用C#编写自己的Windows服务,其基本过程一般为1. 创建C#工程。创建一个EXE工程,可以是WinForm或者命令行格式的。添加对System.ServicePr
7、ocess.dll和System.Configuration.Install.dll的引用。2. 创建服务类。新增一个类,该类型继承System.ServiceProcess.ServiceBase类型,在构造函数中设置ServiceName属性来指明该服务的名称。然后重载它的OnStart方法来响应启动服务的事件,重载OnStop方法来响应停止服务的事件,重载OnPause方法来响应暂停服务的事件,重载OnContinue方法来响应恢复提供服务的事件。在重载这些方法时必须要立即返回,其中不能出现长时间的操作,若
8、处理时间过长则Windows服务管理器会觉得该Windows服务停止响应而报错。为此我们可以使用一个线程来进行实际的工作,而OnStart方法创建线程,OnStop方法关闭线程,OnPause方法挂起线程,而OnContinue方法来恢复运行线程。3. 启动服务。在main函数中调用“System.ServiceProcess.ServiceBase.Run( 自定义服务类的实例 )”来运行服务。比如“System.ServiceProcess.ServiceBase.Run( new MyS
9、ervice() )”,这里的MyService就是继承自ServiceBase。4. 安装服务。新增一个类,该类型继承自System.Configuration.Install.Installer类型,该类型用于配合微软.NET框架自带的安装命令行工具InstallUtil.exe的。我们为该类型附加System.ComponentModel.RunInstallerAttribute特性,并在它的构造函数中使用System.ServiceProcess.ServiceInstaller对象和System.Se
10、rviceProcess.ServiceProcessInstaller对象向系统提供该服务的安装信息。程序编译后我们可以使用命令行“InstallUtil.exe EXE文件名”向Windows服务管理器注册服务,可以使用命令行“InstallUtil.exe /u EXE文件名”从Windows服务管理器中注销服务。5. 编写服务客户端。这是一个根据实际情况而可选的过程,由于Windows服务是没有用户界面的,因此我们可以编写一个具有用户界面的程序来显示和控制Win
11、dows服务提供的数据,并进行一些系统设置等操作。比如对于MS SQL Server,数据库引擎是以服务的形式存在,而SQL Server企业管理器就是一个客户端软件。软件功能需求现在我们要求使用C#和VS.NET2005开发一个软件,该软件功能为1. 该软件能监视指定目录下的文件和子目录的新增,修改,删除和重命名操作,并将操作日志记录到一个数据库中。2. 该软件以Windows服务的形式运行,能监视不同的用户帐户的操作记录。3.&
12、#160; 有一个客户端软件能控制服务,并能查看服务的保存的监视记录。其用户界面为客户端软件还能设置服务监视的目录,系统设置对话框为软件设计命令行参数设计一般而言,我们将服务和客户端分成两个C#工程开发,但这里为了方便我们只在一个工程中实现服务器和客户端软件的开发。Windows服务是不能显示图形化用户界面的,但并不是说Windows服务的软件中不能包含显示图形化用户界面的软件模块。我们完全可以编写一个EXE,其中包含服务器和客户端两个相互独立的软件模块。直接执行EXE将以服务模式运行,若带有命令行参数将以客户端模式运行。为
13、此我们设计了如下的命令行参数命令行参数功能无任何参数以服务模式运行,调用ServiceBase.Run函数来运行服务。/install调用InstallUtil.exe安装服务,将EXE自己注册到Windows服务管理器中。/uninstall调用InstallUtil.exe卸载服务。/client以客户端模式运行,显示图形用户界面。/debug以调试模式下运行,方便VS.NET对服务的操作过程提供调试。使用VS.NET调试服务是一个比较麻烦的事,首先我们得安装并运行服务,然后使用VS.NET的菜单项目“工具-附加到进程”的操作来附加到服务程序,然后设置断点进行调试,其中OnStart函数是
14、没有办法设置断点调试的。为此我们专门添加一个“/debug”命令行参数使得程序不进入服务模式,而是直接运行提供服务内容的功能性代码,然后主线程休眠,但功能性代码还在运行,可以调试。这样我们在VS.NET中设置断点后可以直接运行进行调试了。这里我们设计的C#工程名称为MyWindowsService,编译生成的文件为MyWindowsService.exe。数据库设计在本软件中,数据将保存到应用程序目录下的一个名为FileSystemWatcher.mdb的Access2000格式的数据库。数据库中的表结构为文件系统操作日志表 FileSystemLog,字段有字段名类型说明Recor
15、dID文本(50)记录编号WatchTime文本(20)记录时间,为yyyy-MM-dd HH:mm:ss格式ObjectName文本(250)对象名称EventStyle文本(50)事件类型该数据表中保存的数据范例为RecordIDWatchTimeObjectNameEventStyle0d4e0d9a-6826-415b-bd47-c86fbb1449b02008-10-02 15:31:27c:"aaaaaa.txtRenamed22c1df6d-4f94-488c-a705-e8024d8752132008-10-02 20:37:03d:"aa.pngRenam
16、ed27632fe8-6cbf-4a41-95ad-6ab2e82221922008-10-02 20:40:56c:"a.pdfCreated48403266-0150-44c8-8efa-169f7a68bcb42008-10-03 11:02:04c:"zzzzzz.bmpRenamed6c3b603a-f43b-415c-8122-4aa23376d5752008-10-02 11:26:57c:"SDC_2008_10_2.logChanged6fb9fad1-51f5-40b2-b05b-d0628f775a3c2008-10-02 15:31:52c
17、:"aaaaaa.txtDeleted735d74e6-1548-4d7d-9048-ab75dd1c58742008-10-02 20:31:27c:"aa.bmpRenamed7b36a079-c56c-48f7-9c6e-cf0d77b9c6c12008-10-02 11:27:12c:"SDC_2008_10_2.logChanged7c2672ac-b210-4eca-9277-2505030e72e52008-10-02 20:39:12d:"aa.pngDeleted9ab95c19-ccd0-43eb-89ec-3930ebec9a8d2
18、008-10-02 21:55:57c:"b.bmpRenamed9adb5696-fb6a-497e-b4ff-06f5da8964342008-10-02 20:39:12d:"1.pngDeleted9f4d702f-57c1-46ec-a827-701c2a15ee812008-10-02 23:59:04c:"新建文件夹Createdc163fa48-f5ea-49b1-95c9-b89f9ee622e52008-10-02 11:26:42c:"新建 文本文档.txtCreated对于新增文件或目录操作其EventStyle值为Cr
19、eated,对于修改为Changed,对于删除为Deleted,对于重命名为Renamed。 系统设置信息表 SystemConfig,字段有字段名类型说明ConfigName文本(50)系统配置名称ConfigValue文本(250)配置数据该数据表中保存的数据的范例为ConfigNameConfigValueLogChangedTrueLogCreatedTrueLogDeletedTrueLogRenamedFalsepath0c:"*.txtpath1d:" 在这里
20、配置项LogChanged表示是否监视文件内容是否被改变事件,配置项LogCreated表示是否监视新建文件或目录事件,配置项LogDeleted表示是否监视文件或目录删除事件,配置项LogRenamed表示是否监视文件或目录重命名事件。而path0,path1,path2等表示监视的路径,支持通配符。系统配置中可以有若干个path配置项。文件系统监视功能设计我们可以使用System.IO.FileSystemWatcher来监视文件系统的对象的修改,我们可以使用它的Path属性来设置要监视的文件夹,使用Filter属性来设置文件名过滤器,然后响应它的Changed事件来处理文件内容修改操作,
21、响应Created事件来处理新增文件或目录操作,响应Deleted事件来处理删除文件或目录操作,响应Renamed事件来处理文件和目录重命名操作。这这里我们简单是将这些事件信息保存到数据表FileSystemLog中。程序在监视文件系统前会读取系统配置信息表SystemConfig中读取配置信息,根据其中的path配置项目创建若干个FileSystemWatcher对象展开监视。我们选定服务的名称为“MyFileSystemWatcher”。客户端设计本软件的客户端具有一个图形化用户界面,其界面设计如下客户端主窗体工具条:刷新 删除记录 系统配置 启动服务
22、0;停止服务数据列表显示从 FileSystemLog表查询所得的数据状态栏此外还有一个系统配置对话框,用于查看和修改数据表SystemConfig中保存的系统配置信息。软件说明根据上述的软件设计,我已经把软件编写完毕,现对该软件结构进行说明客户端主界面 frmClient本软件为一个C#编写的EXE,主要包含服务端软件模块和客户端软件模块。首先对比较好理解的具有图形化用户界面的客户端模块进行说明,客户端的主界面为 这个界面主要功能是数据库信息管理,最上面为一个工具条,中间大部分的一个ListView控件,最下面为状态栏。对于ListView控件其内容是分组的,因
23、此需要设计其分组信息,在VS.NET的窗体设计器中我们点中ListView控件,在旁边的属性列表中选择Groups属性,点击旁边的小按钮可以弹出分组设计器。 使用这个分组编辑器我们可以很容易的设计该ListView控件的分组信息。这个窗体的加载事件处理为/ <summary>/ 服务已经安装标记/ </summary>private bool bolServiceInstalled = false private void frmViewLog_Load(object sender,
24、60;EventArgs e) try System.ServiceProcess.ServiceController control = newSystem.ServiceProcess.ServiceController("MyFileSystemWatcher"); System.ServicePro
25、cess.ServiceControllerStatus status = control.Status; control.Dispose(); bolServiceInstalled = true; catch( Exception ext )
26、; lblServiceInstall.Text = "服务尚未安装" ; myTimer.Enabled = false ; btnStartService.Enabled = false ; btnStopService.Enabled =
27、60;false ; bolServiceInstalled = false ; MessageBox.Show( this,"服务尚未安装:" + ext.Message , "系统错误"); this.btnRefresh_Click(null,
28、0;null);在这里我们首先创建一个联系到文件监视服务的ServiceController,调用它的Status属性,若一切正常则表示服务已经安装,我们设置bolServiceInstalled的标志变量,若发生错误则服务尚未安装,则显示“服务尚未安装”的提示信息。 对于工具条的“刷新列表”按钮,其点击事件处理为private void btnRefresh_Click(object sender, EventArgs e) this.Cursor = System.Windows.Forms.C
29、ursors.WaitCursor; lvwRecord.BeginUpdate(); try lvwRecord.Items.Clear(); using (System.Data.IDbCommand cmd = Util.DBConnection.CreateCommand(
30、) cmd.CommandText = "Select RecordID , ObjectName , WatchTime , EventStyle From FileSystemLog order by WatchTime"
31、60; System.Data.IDataReader reader = cmd.ExecuteReader(); while (reader.Read()
32、 ListViewItem NewItem = new ListViewItem(); NewItem.Tag = Convert.ToString(reader.GetValue(0);
33、 NewItem.Text = Convert.ToString(reader.GetValue(1); NewItem.SubItems.Add(Convert.ToString(reader.GetValue(2);
34、;string Style = Convert.ToString(reader.GetValue(3); NewItem.SubItems.Add(Style); Style = Style.Trim().ToLower();
35、160; if (Style = "created")
36、 NewItem.Group = lvwRecord.Groups0; NewItem.ImageIndex = 0;
37、 else if (Style = "changed") &
38、#160; NewItem.Group = lvwRecord.Groups1; NewItem.ImageIndex = 1;
39、160; else if (Style = "deleted")
40、160; NewItem.Group = lvwRecord.Groups2; NewItem.ImageIndex = 2;
41、60; else if (Style = "renamed")
42、60; NewItem.Group = lvwRecord.Groups3; NewItem.ImageIndex = 3;
43、0; NewItem.StateImageIndex = NewItem.ImageIndex; lvwRecord.Items.Add(Ne
44、wItem); reader.Close(); myStatus.Text = "共列出 " + lvwRecord.Items.Co
45、unt + " 个记录" catch (Exception ext) MessageBox.Show(ext.ToString(), "系统错误"); this.Cursor = System.Windows.Forms.Curs
46、ors.Default; lvwRecord.EndUpdate();在该按钮事件处理中,我们查询数据表FileSystemLog,对每一条查询所得的数据创建一个ListViewItem项目,并根据记录的EventStyle值设置该列表项目的图标序号和分组状态。 工具条的“删除记录”按钮用于删除列表中选择的项目,其点击事件处理为private void btnDelete_Click(object sender, EventArgs e) if (lvwRecor
47、d.SelectedItems.Count > 0) using (System.Data.IDbCommand cmd = Util.DBConnection.CreateCommand() for (int
48、160;iCount = lvwRecord.Items.Count - 1; iCount >= 0; iCount-) ListViewItem item = lvwRecord.ItemsiCount; &
49、#160; if (item.Selected) cmd.Command
50、Text = "Delete From FileSystemLog Where RecordID = '" + item.Tag + "'" cmd.ExecuteNonQuery(); &
51、#160; lvwRecord.Items.Remove(item); /for /using
52、 在刷新列表中,我们将列表项目的Tag属性值设置为数据库记录的编号,在这里我们利用这个事先保存的数据库记录的编号拼凑出SQL语句然后删除指定的记录。 工具条的“启动服务”按钮用于启动后台的文件监视服务。其点击事件处理为private void btnStartService_Click(object sender, EventArgs e) if (bolServiceInstalled = false) &
53、#160; return; using (System.ServiceProcess.ServiceController control = newSystem.ServiceProcess.ServiceController("MyFileSystemWatcher") if (control.Status = System.ServicePr
54、ocess.ServiceControllerStatus.Stopped) control.Start(); 在这里我们创建一个ServiceController对象,若判断出服务的状态为停止,则调用控制器的Start方法来启动服务,在这里Start方法内部
55、只是通知操作系统启动指定名称的服务,它发送通知后立即返回,并不会等待服务启动后返回。类似的对于“停止服务”,其点击事件处理为private void btnStopService_Click(object sender, EventArgs e) if (bolServiceInstalled = false) return; using (System.Ser
56、viceProcess.ServiceController control = newSystem.ServiceProcess.ServiceController("MyFileSystemWatcher") if (control.Status = System.ServiceProcess.ServiceControllerStatus.Running)
57、60; control.Stop(); 在这个处理过程中,若判断出服务状态为运行中,则调用控制器的Stop方法来停止服务。在这里Stop方法内部只是通知操作系统停止指定的服务,它发送通知后立即返回,不会等待服务停止后返回。我们还在窗体上放置一个定时器控件,定时间隔为2秒,用于根据服务的状态刷新工具条按钮状态,其定时事件处理为pri
58、vate void myTimer_Tick(object sender, EventArgs e) if (bolServiceInstalled = false) return; using (System.ServiceProcess.ServiceController control = newSystem.ServiceProces
59、s.ServiceController("MyFileSystemWatcher") btnStartService.Enabled = (control.Status = System.ServiceProcess.ServiceControllerStatus.Stopped); btnStopService.Enabled = (control.Status = S
60、ystem.ServiceProcess.ServiceControllerStatus.Running); 在这里我们创建了一个绑定到文件系统监控服务的ServiceController对象,然后根据它的Status状态来设置“启动服务”和“停止服务”按钮的可用状态。系统配置对话框 dlgConfig在客户端主窗体中点击工具条的“系统配置”按钮就会弹出系统设置对话框,该对话框的用户界面为该对话框比较简单,就是用于显示和修改系统配置信息对象MyConfig中的内容。由于文件系统监视服务只有在启动的时候读取系统配置信息,因此对系统配置的任何修改都需要
61、重新启动服务才能生效。系统配置信息对象 MyConfig系统配置信息对象MyConfig用于读取和修改保存在数据表SystemConfig中的系统配置信息。其包含的配置信息的代码如下private bool bolLogRenamed = true;/ <summary>/ 是否记录重命名事件/ </summary>public bool LogRenamed get return bolLogRenamed;
62、; set bolLogRenamed = value; private bool bolLogChanged = true;/ <summary>/ 是否记录文件修改事件/ </summary>public bool LogChanged get return bolLogChanged; set bolLogChanged = value;
63、 private bool bolLogCreated = true;/ <summary>/ 是否记录对象创建事件/ </summary>public bool LogCreated get return bolLogCreated; set bolLogCreated = value; private bool bolLogDeleted = true;/
64、0;<summary>/ 是否记录对象删除事件/ </summary>public bool LogDeleted get return bolLogDeleted; set bolLogDeleted = value; private string myWatchedPaths = null;/ <summary>/ 监视的目录/ </
65、summary>public string WatchedPaths get return myWatchedPaths; set myWatchedPaths = value; 它的Load方法用于从数据库中加载配置信息,其处理过程为public void Load() myWatchedPaths = null; System.Collections.ArrayList path
66、s = new System.Collections.ArrayList(); using (System.Data.IDbCommand cmd = Util.DBConnection.CreateCommand() cmd.CommandText = "Select ConfigName , ConfigValue From SystemConfig"
67、0; System.Data.IDataReader reader = cmd.ExecuteReader(); while (reader.Read() string Name = Convert.ToString(reader.GetValue(0
68、); if (Name = null) continue;
69、 Name = Name.Trim().ToLower(); string Value = Convert.ToString(reader.GetValue(1);
70、160; if (Name.StartsWith("path") paths.Add(Value.Trim();
71、0; else if (Name = "logrenamed") bolLogRenamed = Convert.ToBoolean(Va
72、lue); else if (Name = "logchanged")
73、160; bolLogChanged = Convert.ToBoolean(Value); else if (Name = "logdeleted")
74、; bolLogDeleted = Convert.ToBoolean(Value);
75、; else if (Name = "logcreated") bolLogCreated = Convert.ToBoolean(Value);
76、160; myWatchedPaths = (string)paths.ToArray(typeof(string);在该方法中程序查询数据表SystemConfig中的配置项目名称和数据,若项目名称以“path”开头则为要监视的路径,而配置项logrenamed,logchanged,logdeleted,logcreated分别表示是否监视文件目录重命名,修改,删除和新建等操作。MyConfig对象还有一个
77、Save方法用于将系统配置信息保存到数据库中,其处理过程为public void Save() using (System.Data.IDbCommand cmd = Util.DBConnection.CreateCommand() cmd.CommandText = "Delete From SystemConfig"
78、60; cmd.ExecuteNonQuery(); cmd.CommandText = "Insert Into SystemConfig ( ConfigName , ConfigValue ) Values( ? , ? )" ; System.Data.IDbDataParameter pName = cmd.CreateParameter();
79、; cmd.Parameters.Add( pName ); System.Data.IDbDataParameter pValue = cmd.CreateParameter(); cmd.Parameters.Add( pValue );
80、; pName.Value = "LogRenamed" pValue.Value = bolLogRenamed.ToString(); cmd.ExecuteNonQuery(); pName.Value = "LogChanged" &
81、#160; pValue.Value = bolLogChanged.ToString(); cmd.ExecuteNonQuery(); pName.Value = "LogDeleted" pValue.Value = bolLogDeleted.ToS
82、tring(); cmd.ExecuteNonQuery(); pName.Value = "LogCreated" pValue.Value = bolLogCreated.ToString(); cmd.Execute
83、NonQuery(); for (int iCount = 0; iCount < myWatchedPaths.Length; iCount+) string path = myWatchedPaths iCount ;
84、; if( path = null | path.Trim().Length = 0 ) continue ;
85、0; pName.Value = "path" + iCount ; pValue.Value = path ; cmd.ExecuteN
86、onQuery(); 在这个方法中,首先删除数据表SystemConfig中所有的记录,然后将所有的配置信息保存到数据表SystemConfig中。文件系统监视服务 MyFileSystemWatcherService类MyFileSystemWatcherService就是文件系统监视服务,它是从ServiceBase派生的,首先说明一下执行文件系统监视的功能性的过程,其代码如下/ <summary>/ 文件系统监视器列表/ </su
87、mmary>private System.Collections.ArrayList myWatchers = null; / <summary>/ 开始启动文件系统监视/ </summary>/ <returns>操作是否成功</returns>internal bool StartFileSystemWatching() myWatchers = new System.Collections.ArrayList(); &
88、#160; MyConfig.Instance.Load(); string paths = MyConfig.Instance.WatchedPaths; System.Text.StringBuilder myPathList = new StringBuilder(); if (paths != null)
89、; foreach (string path in paths) if (System.IO.Path.IsPathRooted(path) = false)
90、60; continue; string BasePath = null; &
91、#160; string Filter = null; if (System.IO.Directory.Exists(path)
92、0; BasePath = path; Filter = "*.*"
93、0; else BasePath = System.IO.Path.GetDirectoryName(path);
94、0; Filter = System.IO.Path.GetFileName(path); if (BasePath = null)
95、 continue; BasePath = BasePath.Trim();
96、0; if (BasePath.ToUpper().StartsWith(System.Windows.Forms.Application.StartupPath) / 不能监视程序本身所在的目录的文件系统更改
97、0; continue; if (System.IO.Directory.Exists(BasePath) = false)
98、 / 不能监视不存在的目录 continue;
99、160; if (myPathList.Length > 0) myPath
100、List.Append(""); myPathList.Append(path); System.IO.FileSystemWatcher watcher = new
101、60;System.IO.FileSystemWatcher(); watcher.Path = BasePath; watcher.Filter = Filter; watcher.EnableRais
102、ingEvents = true; watcher.IncludeSubdirectories = false; if (MyConfig.Instance.LogChanged) watcher.Changed += delegate(object sender, System.IO.FileSystemEventArgs args)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年茶艺师职业技能鉴定考试模拟试卷:茶艺知识长尾词解析试题
- 2025年辅导员招聘考试题库:心理健康教育案例解析试题
- 2025年注册会计师考试《会计》实战模拟试题解析与技巧
- 拓展2025年:大学辅导员招聘考试题库-校园文化建设案例分析解析
- 2025年企业培训师职业资格考试真题卷(培训师课程设计技巧锻炼技巧锻炼技巧篇)
- 2025年小学语文毕业升学考试全真模拟卷(语文综合素养拓展)-古诗词鉴赏能力提升技巧与应用试题
- 厨师保洁考试试题及答案
- 云南护士考试试题及答案
- 火化厂招聘考试试题及答案
- 新建工程1-冷负荷计算书改新风比
- 直播中的礼仪与形象塑造
- 2024年八年级数学下册期中检测卷【含答案】
- 老年人中医健康知识讲座总结
- 海南声茂羊和禽类半自动屠宰场项目环评报告
- 跳绳市场调研报告
- 《民法典》合同编通则及司法解释培训课件
- 《大学生的情绪》课件
- 交通事故法律处理与索赔案例分析与实践指导
- 2023年河北高中学业水平考试物理试卷真题及答案详解
- 大学生组织管理能力大赛题库第三届
- 定向钻出入土点平面布置图(可编辑)
评论
0/150
提交评论