体系结构课件-16插件架构.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

任课教师:张伟芝zhangweizhi@eud2act.org任课教师:张伟芝zhangweizhi@eud2act.org第十六章软件体系结构风格任课教师:张伟芝zhangweizhi@eud2act.org上节回顾任课教师:张伟芝zhangweizhi@eud2act.org课程内容插件技术背景插件机制(Mechanism)插件技术基础——动态链接库(DLL)基于插件技术的系统案例任课教师:张伟芝zhangweizhi@eud2act.org课程内容插件技术背景插件机制(Mechanism)插件技术基础——动态链接库(DLL)基于插件技术的系统案例任课教师:张伟芝zhangweizhi@eud2act.org插件Plug-in定义InComputing,aplug-in(alsocalledplugin,addin,add-in,addon,add-on,snap-inorsnapin,butseealsoextension)consistsofacomputerprogramthatinteractswithahostapplication(awebbroweroranemailclient,forexample)toprovideacentain,usuallveryspecific,function“ondemand”任课教师:张伟芝zhangweizhi@eud2act.org典型的插件系统MicrosoftOfficeGraphicsoftwareWebbrowsersSoftwaredevelopmentenvironment……任课教师:张伟芝zhangweizhi@eud2act.org典型的插件系统任课教师:张伟芝zhangweizhi@eud2act.org使用插件的意义支持特性扩展支持第三方开发降低应用程序大小插件不是简单的功能扩展!任课教师:张伟芝zhangweizhi@eud2act.org课程内容插件技术背景插件机制(Mechanism)插件技术基础——动态链接库(DLL)基于插件技术的系统案例任课教师:张伟芝zhangweizhi@eud2act.org什么是插件技术在程序设计过程中,把应用程序分成两部分宿主程序(host)插件(plug-in)契约(contract)任课教师:张伟芝zhangweizhi@eud2act.org插件系统架构任课教师:张伟芝zhangweizhi@eud2act.org插件系统实现步骤设计契约(取决于业务背景)设计插件设计宿主程序任课教师:张伟芝zhangweizhi@eud2act.org课程内容插件技术背景插件机制(Mechanism)插件技术基础——动态链接库(DLL)基于插件技术的系统案例任课教师:张伟芝zhangweizhi@eud2act.org编译器和解释器解释器在软件中的应用由来已久,早期的程序语言环境就分为编译(Complication)和解释(Interpretation)两大类二者在目标、功能与实现上有何差别?二者的性能有何差别?任课教师:张伟芝zhangweizhi@eud2act.org编译器(Compiler)解释器(Interpreter)任课教师:张伟芝zhangweizhi@eud2act.org静态链接任课教师:张伟芝zhangweizhi@eud2act.org动态链接动态链接指的是在链接时并没有将库函数中的函数连接到应用程序的可执行文件。链接是在程序中运行时动态来执行的。采用动态链接方式的库文件即为DLL(DynamicLinkableLibrary)。任课教师:张伟芝zhangweizhi@eud2act.org动态链接任课教师:张伟芝zhangweizhi@eud2act.orgDLL到进程地址空间的映射要调用DLL中的函数,首先必须把DLL的文件映像映射到调用进程的地址空间中。有两种方法可以实现这一映射:装入时动态链接(load-timedynamiclinking)运行时动态链接(run-timedynamiclinking)任课教师:张伟芝zhangweizhi@eud2act.org装入时动态链接当应用程序运行时,操作系统在装载应用程序是要查看exe文件映像的内容,并将所有被引用的DLL文件映像映射到进程的地址空间中。系统在寻找DLL文件时,按以下目录次序搜索包含可执行应用程序的目录当前目录Windows系统目录,使用GetSystemDirectory函数可以返回该目录路径Windows目录,使用GetWindowsDirectory函数可以返回该目录路径。如果按以上次序找不到DLL,应用程序即被终止。任课教师:张伟芝zhangweizhi@eud2act.org运行时动态链接将链接推迟到运行期间,那么正确的DLL就可以判定,然后被动态链接,这便是运行时动态链接的基本思路任课教师:张伟芝zhangweizhi@eud2act.org课程内容插件技术背景插件机制(Mechanism)插件技术基础——动态链接库(DLL)基于插件技术的系统案例任课教师:张伟芝zhangweizhi@eud2act.org案例:基于C#实现插件管理器任课教师:张伟芝zhangweizhi@eud2act.org任课教师:张伟芝zhangweizhi@eud2act.org案例:基于C#实现插件管理器Net技术实现插件机制的步骤动态加载Assembly类的几个静态的Load(Load,LoadFile,LoadFrom)方法来动态加载获得所有类型判定是否为插件接口类型创建插件实例任课教师:张伟芝zhangweizhi@eud2act.org案例:基于C#实现插件管理器classUseCaseModelFirstPlugin-application:IApplication=null-description:String=-name:String=-button_Click(object,EventArgs):void+Load():void+UnLoad():void«property»+Application():IApplication+Description():string+Name():string«event»+Loading():EventHandlerEventArgs«interface»IApplication«property»+BottomToolPanel():ToolStripPanel+LeftToolPanel():ToolStripPanel+MainMenuStrip():MenuStrip+RightToolPanel():ToolStripPanel+StatusBar():StatusStrip+TopToolPanel():ToolStripPanelFormMainForm-plugins:DictionaryString,IPlugin=newDictionary...+MainForm()-toolStripButton1_Click(object,EventArgs):void-toolStripButton2_Click(object,EventArgs):void«property»+BottomToolPanel():ToolStripPanel+LeftToolPanel():ToolStripPanel+RightToolPanel():ToolStripPanel+StatusBar():StatusStrip+TopToolPanel():ToolStripPanel«interface»IPlugin+Load():void+UnLoad():void«property»+Application():IApplication+Description():String+Name():String«event»+Loading():EventHandlerEventArgs+application任课教师:张伟芝zhangweizhi@eud2act.org设计契约:应用程序契约任课教师:张伟芝zhangweizhi@eud2act.org设计契约:插件契约任课教师:张伟芝zhangweizhi@eud2act.org插件代码任课教师:张伟芝zhangweizhi@eud2act.org插件代码任课教师:张伟芝zhangweizhi@eud2act.org宿主程序代码任课教师:张伟芝zhangweizhi@eud2act.org扩展案例:音频播放器通过模拟的音频播放器来介绍插件的实现技术一般音频播放器都有这样一些基本功能:装载音频文件(LoadFile)播放(Play)暂停(Pause)停止(Stop)本例将提供这四个功能。但宿主程序本身不会直接实现这些功能,而是调用插件的实现。每个插件支持一种音频格式,所以每个插件的功能实现都是不同的。任课教师:张伟芝zhangweizhi@eud2act.org扩展案例:音频播放器——插件的实现创建一个动态链接库Plug.dll,为了支持四个基本功能,它输出相应的四个函数:VoidLoadFile(constchar*szFileName);VoidPlay();VoidPause();VoidStop();任课教师:张伟芝zhangweizhi@eud2act.org扩展案例:音频播放器——插件的实现为了使宿主程序在运行时能知道这个插件可以支持什么格式的音频文件,插件程序还应输出一个函数供宿主程序查询用:VoidGetSupportedFormat(char*szFormat)if(szFormat!=0){strcpy(szFormat,“mp3”);}至此,这个插件就制作完了。可以依样画葫芦再做一个Plug2.dll,它“支持”.wma文件。任课教师:张伟芝zhangweizhi@eud2act.org扩展案例:音频播放器——宿主的实现宿主是一个基于对话框的标准Windows程序。它启动时会搜索约定目录(可以约定所有插件都存放在宿主程序所在目录的Plugins子目录下)使用Win32函数Loadliabrary加载所有插件。每加载一个插件DLL,就调用另一个Win32函数GetSupportedFormat的地址,并调用此函数返回插件所支持的格式名(即是音频文件的的扩展名)然后把(格式名,DLL句柄)二元组保存下来。THUSAGroup35任课教师:张伟芝zhangweizhi@eud2act.org扩展案例:音频播放器——宿主的实现当用户通过菜单打开文件时,宿主程序会根据扩展名决定调用哪个插件的LoadFile函数并指明此插件DLL的句柄为当前使用的插件的DLL句柄(比如保存到变量m_hInst中)此后当用户通过按钮调用Play等其他功能时,就调用句柄为m_hInst的插件的相应功能。THUSAGroup36任课教师:张伟芝zhangweizhi@eud2act.org扩展案例:音频播放器——宿主的实现THUSAGroup37typedefvoid(*PLAY)();if(m_hInst){PLAYPlay=(PLAY)::GetProcAddress(m_hInst,”Play”);Play();}另外,当程序退出时,应该调用FreeLiabrary函数卸载插件任课教师:张伟芝zhangweizhi@eud2act.org小结任课教师:张伟芝zhangweizhi@eud2act.org作业通过插件机制实现音频播放器,或者自拟题目实现插件系统任课教师:张伟芝zhangweizhi@eud2act.orgTHANKSThankYou,谢谢!

1 / 40
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功