动态链接库的处理方法及装置技术领域
本申请涉及动态链接库领域,具体而言,涉及一种动态链接库的处理方法及装置。
背景技术
目前,当研发人员在开发软件中使用动态链接库(Dynamic Link Library,简称DLL)
引用的时候,有时会遇到这样一种情况,程序所依赖的DLL需要加载某些文件才能正
常使用。并且,在进行多语言开发的时候,有时DLL所依赖的文件的引用是由其他语
言编写的读取接口,因此不能将文件作为程序资源添加到Resource中进行读写。对于
这种情况,如果简单地对DLL包进行封装并将文件一同打包到DLL中的话,例如,
对于Visual Studio,由于Visual Studio对于外部文件的特性,在引用DLL包时这些文
件的属性将是“Do Not Copy”,这样在编译程序时,这些文件就无法正确被编译器编
译,因此需要手动的将文件属性从“Do Not Copy”更改到“Copy Always”。或者,如
果封装DLL包时不将文件一同打到DLL包中,那么在添加DLL引用后还需要额外对
文件位置进行配置。无论上述哪种情况,都需要在添加动态链接库后研发人员有额外
的设置,这种情况容易出错,也破坏了原来DLL包功能的完整性。
针对相关技术中引用动态链接库后需要额外的设置,导致容易发生错误的问题,
目前尚未提出有效的解决方案。
发明内容
本申请的主要目的在于提供一种动态链接库的处理方法及装置,以解决相关技术
中引用动态链接库后需要额外的设置,导致容易发生错误的问题。
为了实现上述目的,根据本申请的一个方面,提供了一种动态链接库的处理方法。
该方法包括:获取预设脚本程序,其中,预设脚本程序用于建立目标项目与依赖文件
之间的映射关系,依赖文件为在引用初始动态链接库后,初始动态链接库需要加载的
文件,目标项目为预设程序中引用初始动态链接库的项目;将预设脚本程序的状态调
整为目标状态,其中,目标状态为在生成目标动态链接库后立即执行预设脚本程序的
状态;以及将为目标状态的预设脚本程序、依赖文件和预设代码打包至初始动态链接
库中,生成目标动态链接库。
进一步地,获取预设脚本程序包括:接收外部输入的第一子脚本程序,其中,第
一子脚本程序用于获取目标项目的路径和目标项目的名称;接收外部输入的第二子脚
本程序,其中,第二子脚本程序用于根据目标项目的路径在目标项目的名称所在的文
件夹下添加初始动态链接库;接收外部输入的第三子脚本程序,其中,第三子脚本程
序用于在目标项目的名称所在的文件夹下获取初始动态链接库中的依赖文件,并将目
标项目与获取到初始动态链接库中的依赖文件建立映射关系;以及获取预设脚本程序,
其中,预设脚本程序是由第一子脚本程序、第一子脚本程序和第二子脚本程序组成的
脚本程序。
进一步地,在接收外部输入的第一子脚本程序之前,该方法还包括:在引用初始
动态链接库时,确定初始动态链接库需要加载的文件的扩展名;以及根据扩展名确定
初始动态链接库需要加载的依赖文件。
进一步地,在接收外部输入的第一子脚本程序之前,该方法还包括:通过正则表
达式设置符合依赖文件的条件,得到匹配条件;根据匹配条件与多个文件进行匹配;
以及获取多个文件中符合匹配条件的文件,并将多个文件中符合匹配条件的文件作为
初始动态链接库需要加载的依赖文件。
进一步地,在生成目标动态链接库之后,该方法还包括:引用目标动态链接库;
以及目标动态链接库中为目标状态的预设脚本程序建立目标项目与目标动态链接库中
的依赖文件之间的映射关系。
为了实现上述目的,根据本申请的另一方面,提供了一种动态链接库的处理装置。
该装置包括:获取单元,用于获取预设脚本程序,其中,预设脚本程序用于建立目标
项目与依赖文件之间的映射关系,依赖文件为在引用初始动态链接库后,初始动态链
接库需要加载的文件,目标项目为预设程序中引用初始动态链接库的项目;调整单元,
用于将预设脚本程序的状态调整为目标状态,其中,目标状态为在生成目标动态链接
库后立即执行预设脚本程序的状态;以及生成单元,用于将为目标状态的预设脚本程
序、依赖文件和预设代码打包至初始动态链接库中,生成目标动态链接库。
进一步地,获取单元包括:第一接收模块,用于接收外部输入的第一子脚本程序,
其中,第一子脚本程序用于获取目标项目的路径和目标项目的名称;第二接收模块,
用于接收外部输入的第二子脚本程序,其中,第二子脚本程序用于根据目标项目的路
径在目标项目的名称所在的文件夹下添加初始动态链接库;第三接收模块,用于接收
外部输入的第三子脚本程序,其中,第三子脚本程序用于在目标项目的名称所在的文
件夹下获取初始动态链接库中的依赖文件,并将目标项目与获取到初始动态链接库中
的依赖文件建立映射关系;以及获取模块,用于获取预设脚本程序,其中,预设脚本
程序是由第一子脚本程序、第一子脚本程序和第二子脚本程序组成的脚本程序。
进一步地,该装置还包括:第一确定单元,用于在引用初始动态链接库时,确定
初始动态链接库需要加载的文件的扩展名;以及第二确定单元,用于根据扩展名确定
初始动态链接库需要加载的依赖文件。
进一步地,该装置还包括:设置单元,用于通过正则表达式设置符合依赖文件的
条件,得到匹配条件;匹配单元,用于根据匹配条件与多个文件进行匹配;以及第三
确定单元,用于获取多个文件中符合匹配条件的文件,并将多个文件中符合匹配条件
的文件作为初始动态链接库需要加载的依赖文件。
进一步地,该装置还包括:引用单元,用于引用目标动态链接库;以及创建单元,
用于目标动态链接库中为目标状态的预设脚本程序建立目标项目与目标动态链接库中
的依赖文件之间的映射关系。
通过本申请,采用以下步骤:获取预设脚本程序,其中,预设脚本程序用于建立
目标项目与依赖文件之间的映射关系,依赖文件为在引用初始动态链接库后,初始动
态链接库需要加载的文件,目标项目为预设程序中引用初始动态链接库的项目;将预
设脚本程序的状态调整为目标状态;以及将为目标状态的预设脚本程序、依赖文件和
预设代码打包至初始动态链接库中,生成目标动态链接库,解决了相关技术中引用动
态链接库后需要额外的设置,导致容易发生错误的问题。预设脚本程序自动建立目标
项目与依赖文件之间的映射关系,避免了添加动态链接库引用后需要额外的设置动作,
进而达到降低发生错误的可能性的效果。
附图说明
构成本申请的一部分的附图用来提供对本申请的进一步理解,本申请的示意性实
施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据本申请实施例的动态链接库的处理方法的流程图;以及
图2是根据本申请实施例的动态链接库的处理装置的示意图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相
互组合。下面将参考附图并结合实施例来详细说明本申请。
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的
附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例
仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领
域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于
本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第
二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这
样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语
“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含
了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步
骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的
其它步骤或单元。
为了便于描述,以下对本申请实施例涉及的部分术语进行说明:
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软
件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分
割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程
序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL
文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。DLL文
件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入
DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运
行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用
DLL文件还可以减小程序的体积。
根据本申请的实施例,提供了一种动态链接库的处理方法。
图1是根据本申请实施例的动态链接库的处理方法的流程图。如图1所示,该方
法包括以下步骤:
步骤S101,获取预设脚本程序,其中,预设脚本程序用于建立目标项目与依赖文
件之间的映射关系,依赖文件为在引用初始动态链接库后,初始动态链接库需要加载
的文件,目标项目为预设程序中引用初始动态链接库的项目。
本申请中提及的项目是指开发软件过程中在预设程序下创建的项目,本申请提及
的预设程序可以为开发软件,例如为Visual Studio等,在Visual Studio下创建的项目
在运行时使用动态链接库引用。动态链接库需要加载某些文件才能正常使用。那些需
要加载的文件在本申请中称之为依赖文件。预设编写好的脚本程序用于自动将动态链
接库的依赖文件的文件对象更改对象的属性,例如,将属性从“Do Not Copy”更改到
“Copy Always”,即建立目标项目与依赖文件之间的映射关系。获取预先预设编写好
的脚本程序,即预设脚本程序。
可选地,在本申请实施例提供的动态链接库的处理方法中,获取预设脚本程序包
括:接收外部输入的第一子脚本程序,其中,第一子脚本程序用于获取目标项目的路
径和目标项目的名称;接收外部输入的第二子脚本程序,其中,第二子脚本程序用于
根据目标项目的路径在目标项目的名称所在的文件夹下添加初始动态链接库;接收外
部输入的第三子脚本程序,其中,第三子脚本程序用于在目标项目的名称所在的文件
夹下获取初始动态链接库中的依赖文件,并将目标项目与获取到初始动态链接库中的
依赖文件建立映射关系;以及获取预设脚本程序,其中,预设脚本程序是由第一子脚
本程序、第一子脚本程序和第二子脚本程序组成的脚本程序。
例如,开发人员在Visual Studio下的某个项目添加动态链接库时,Visual Studio
会传给脚本一系列参数,其中之一便是添加动态链接库的目标项目的路径和目标项目
的名称,即根据目标项目的路径在目标项目的名称所在的文件夹下添加初始动态链接
库。然后再遍历目标项目的下的文件,并判断文件是否为动态链接库依赖的文件,得
到依赖文件集合,并更改依赖文件集合中文件对象的属性,如更改后文件“CopyToOu
tputDirectory”属性的值为1,即表示“Copy Always”。即自动将目标项目与依赖文件
集合建立映射关系,在目标项目运行时,能够保证动态链接库能够正常使用。
可选地,在本申请实施例提供的动态链接库的处理方法中,在接收外部输入的第
一子脚本程序之前,该方法还包括:在引用初始动态链接库时,确定初始动态链接库
需要加载的文件的扩展名;以及根据扩展名确定初始动态链接库需要加载的依赖文件。
由于动态链接库的依赖文件可能不止一个,并且需要在项目下所有文件中找到所
有需要修改属性的依赖文件,就需要首先确定依赖文件的范围。通常,依赖文件具有
相同的扩展名,根据依赖文件的扩展名在项目下所有文件中进行搜索,获取到所有动
态链接库需要加载的依赖文件。
可选地,在本申请实施例提供的动态链接库的处理方法中,在接收外部输入的第
一子脚本程序之前,该方法还包括:通过正则表达式设置符合依赖文件的条件,得到
匹配条件;根据匹配条件与多个文件进行匹配;以及获取多个文件中符合匹配条件的
文件,并将多个文件中符合匹配条件的文件作为初始动态链接库需要加载的依赖文件。
由于动态链接库的依赖文件可能不止一个,并且需要在项目下所有文件中找到所
有需要修改属性的依赖文件,就需要首先确定依赖文件的范围。当依赖文件的扩展名
并不唯一时,通过正则表达式设置符合依赖文件的条件。当检索文件时,若文件满足
匹配条件,将多个文件中符合匹配条件的文件作为动态链接库需要加载的依赖文件。
步骤S102,将预设脚本程序的状态调整为目标状态,其中,目标状态为在生成目
标动态链接库后立即执行预设脚本程序的状态。
当依赖文件未添加至目标项目下时,预设脚本程序不会对依赖文件的属性的进行
更改,即不会自动将目标项目与依赖文件集合建立映射关系。当依赖文件添加至目标
项目下后,由于存在一个触发启动预设脚本程序的时间,预设脚本程序也不会立即对
依赖文件的属性的进行更改。因此在本步骤中,为了消除添加动态链接库后需要额外
的设置,因此,需要预设脚本程序的触发过程也是在自动状态下实现的。因此,将预
设脚本程序的状态调整为待执行状态,即将预设脚本程序的状态调整为在生成目标动
态链接库后立即执行该预设脚本程序的状态。
步骤S103,将为目标状态的预设脚本程序、依赖文件和预设代码打包至初始动态
链接库中,生成目标动态链接库。
需要说明的是,本申请中的预设代码为实现引用目标状态的预设脚本程序和依赖
文件的代码。
将为目标状态的预设脚本程序、依赖文件和预设代码打包至初始动态链接库中时,
可以采用Nuget包的方式,在打包时,将依赖文件打到初始动态链接库中content文件
夹下,并将脚本程序打到初始动态链接库中的tools文件夹下,最后将包含为目标状态
的预设脚本程序、依赖文件和预设代码的动态链接库作为目标动态链接库。
可选地,在本申请实施例提供的动态链接库的处理方法中,在生成目标动态链接
库之后,该方法还包括:引用目标动态链接库;以及目标动态链接库中为目标状态的
预设脚本程序建立目标项目与目标动态链接库中的依赖文件之间的映射关系。
当目标项目添加该目标动态链接库引用时,全部动态链接库的依赖文件都将被添
加,并且置于“Copy Always”的状态下,即自动建立目标项目与目标动态链接库中的
依赖文件之间的映射关系,从而避免了目标项目添加动态链接库引用后需要额外的设
置动作,大大降低了发生错误的可能性。
本申请实施例提供的动态链接库的处理方法,通过获取预设脚本程序,其中,预
设脚本程序用于建立目标项目与依赖文件之间的映射关系,依赖文件为在引用初始动
态链接库后,初始动态链接库需要加载的文件,目标项目为预设程序中引用初始动态
链接库的项目;将预设脚本程序的状态调整为目标状态;以及将为目标状态的预设脚
本程序、依赖文件和预设代码打包至初始动态链接库中,生成目标动态链接库,解决
了相关技术中引用动态链接库后需要额外的设置,导致容易发生错误的问题。预设脚
本程序自动建立目标项目与依赖文件之间的映射关系,避免了添加动态链接库引用后
需要额外的设置动作,进而达到降低发生错误的可能性的效果。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的
计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可
以以不同于此处的顺序执行所示出或描述的步骤。
本申请实施例还提供了一种动态链接库的处理装置,需要说明的是,本申请实施
例的动态链接库的处理装置可以用于执行本申请实施例所提供的用于动态链接库的处
理方法。以下对本申请实施例提供的动态链接库的处理装置进行介绍。
图2是根据本申请实施例的动态链接库的处理装置的示意图。如图2所示,该装
置包括:获取单元10、调整单元20和生成单元30。
获取单元10,用于获取预设脚本程序,其中,预设脚本程序用于建立目标项目与
依赖文件之间的映射关系,依赖文件为在引用初始动态链接库后,初始动态链接库需
要加载的文件,目标项目为预设程序中引用初始动态链接库的项目。
调整单元20,用于将预设脚本程序的状态调整为目标状态,其中,目标状态为在
生成目标动态链接库后立即执行预设脚本程序的状态。
生成单元30,用于将为目标状态的预设脚本程序、依赖文件和预设代码打包至初
始动态链接库中,生成目标动态链接库。
本申请实施例提供的动态链接库的处理装置,通过获取单元10获取预设脚本程
序,其中,预设脚本程序用于建立目标项目与依赖文件之间的映射关系,依赖文件为
在引用初始动态链接库后,初始动态链接库需要加载的文件,目标项目为预设程序中
引用初始动态链接库的项目;调整单元20将预设脚本程序的状态调整为目标状态;生
成单元30将为目标状态的预设脚本程序、依赖文件和预设代码打包至初始动态链接库
中,生成目标动态链接库,解决了相关技术中引用动态链接库后需要额外的设置,导
致容易发生错误的问题,预设脚本程序自动建立目标项目与依赖文件之间的映射关系,
避免了添加动态链接库引用后需要额外的设置动作,进而达到降低发生错误的可能性
的效果。
可选地,在本申请实施例提供的动态链接库的处理装置中,获取单元10包括:第
一接收模块,用于接收外部输入的第一子脚本程序,其中,第一子脚本程序用于获取
目标项目的路径和目标项目的名称;第二接收模块,用于接收外部输入的第二子脚本
程序,其中,第二子脚本程序用于根据目标项目的路径在目标项目的名称所在的文件
夹下添加初始动态链接库;第三接收模块,用于接收外部输入的第三子脚本程序,其
中,第三子脚本程序用于在目标项目的名称所在的文件夹下获取初始动态链接库中的
依赖文件,并将目标项目与获取到初始动态链接库中的依赖文件建立映射关系;以及
获取模块,用于获取预设脚本程序,其中,预设脚本程序是由第一子脚本程序、第一
子脚本程序和第二子脚本程序组成的脚本程序。
可选地,在本申请实施例提供的动态链接库的处理装置中,该装置还包括:第一
确定单元,用于在引用初始动态链接库时,确定初始动态链接库需要加载的文件的扩
展名;以及第二确定单元,用于根据扩展名确定初始动态链接库需要加载的依赖文件。
可选地,在本申请实施例提供的动态链接库的处理装置中,该装置还包括:设置
单元,用于通过正则表达式设置符合依赖文件的条件,得到匹配条件;匹配单元,用
于根据匹配条件与多个文件进行匹配;以及第三确定单元,用于获取多个文件中符合
匹配条件的文件,并将多个文件中符合匹配条件的文件作为初始动态链接库需要加载
的依赖文件。
可选地,在本申请实施例提供的动态链接库的处理装置中,该装置还包括:引用
单元,用于引用目标动态链接库;以及创建单元,用于目标动态链接库中为目标状态
的预设脚本程序建立目标项目与目标动态链接库中的依赖文件之间的映射关系。
上述动态链接库的处理装置包括处理器和存储器,上述获取单元、调整单元和生
成单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序
单元实现相应功能。上述预设脚本程序、预设程序、预设代码都可以存储在存储器中。
处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个
或以上,通过调整内核参数处理动态链接库。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/
或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一
个存储芯片。
本申请还提供了一种计算机程序产品的实施例,当在数据处理设备上执行时,适
于执行初始化有如下方法步骤的程序代码:获取预设脚本程序,其中,预设脚本程序
用于建立目标项目与依赖文件之间的映射关系,依赖文件为在引用初始动态链接库后,
初始动态链接库需要加载的文件,目标项目为预设程序中引用初始动态链接库的项目;
将预设脚本程序的状态调整为目标状态;以及将为目标状态的预设脚本程序、依赖文
件和预设代码打包至初始动态链接库中,生成目标动态链接库。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系
列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限
制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术
人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块
并不一定是本申请所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部
分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置,可通过其它的方
式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅
仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可
以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显
示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到
多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例
方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以
是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成
的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用
的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所
组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以
将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模
块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请
不限制于任何特定的硬件和软件结合。
以上所述仅为本申请的优选实施例,并不用于限制本申请,对于本领域的技术人
员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何
修改、等同替换、改进等,均应包含在本申请的保护范围之内。