⑴ DLL文件编译,高手请指教。
DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作的许多函数和资源。
DLL多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。它们向运行于Windows操作系统下的程序提供代码、数据或函数。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。
DLL的全称是Dynamic Link Library, 中文叫做“动态链接文件”。在Windows操作系统中, DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。而有些DLL文件可以被许多程序共用。因此, 程序设计人员可以利用DLL文件, 使程序不至于太过巨大。但是当安装的程序越来越多, DLL文件也就会越来越多, 如果当你删除程序的时候, 没有用的DLL文件没有被删除的话, 久而久之就造成系统的负担了。
DLL是动态连接库。使用动态连接库的一些好处是:
1.多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。
2.在钩子程序过滤系统消息时必须使用动态连接库。
3.动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。而且,各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态连接库中,让小组的其他成员使用。
4.为了实现应用程序的国际化,往往需要使用动态连接库。使用动态连接库可以将针对某一国家、语言的信息存放在其中。对于不同的版本,使用不同的动态连接库。在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态连接库实现的。
VC++、C++ Builder、Delphi都可以编写DLL文件。Visual Basic 5.0以上版本也可以编写一种特殊的DLL,即ActiveX DLL。
DLL不是独立运行的程序,它是某个程序的一个部分,它只能由所属的程序调用。用户不能,也不需要打开它。
⑵ C# dll编译问题
这个只有三楼说对了!
事实上我们在引用时自己开发的dll时存在两种引用方式:
引用时选择的是项目(dll项目也在项目资源管理器中),这里引用最直接,原则上是使用这种引用的方式。
引用时选择的是文件(直接引用了文件夹中指定的dll),这里引用其实一般用于不一个项目资源管理器时的使用(因为这个dll的源码你无法拿到,或者为了不允许你更改,要求你引用文件而不是项目)
当然,如果条件允许,引用前可以在资源管理器先添加已存在的项目(当然是你要引用的那个项目),然后按第一种引用方式引用!
两种引用方式有一定的区别:
引用项目其实是在项目资源管理器中形成一个依赖关系,这个可以在项目管理管理器上右面查看项目依赖关系(不是在项目上右击,不是在项目上右击,不是在项目上右击,重要的事说三遍,因为很多人连项目与项目资源管理器都没分清!)正是因为有这个项目依赖的关系,所以IDE在编译时会按照依赖关系进行生成——也就是说被引用项目要比引用项目先生成!当然了,我见过一些“牛X"程序员把自己项目中乱写一通,最后形成了一个环状引用,还告诉我说找到了vs的bug,项目生成失败,而且无解!汗了~~自己原理不清楚,你以为臭虫那么好捉?
之所以这么说,就是因为其实你每次生成时,由于依赖关系的原因,引用的永远是最后的dll,不管是有人解释为“所有项目重新生成了,所以能引用到最新的”,还是解释为“直接引用了被引用项目bin中的文件”,还是解释为“通知了依赖项项目更新引用文件”等等不影响你使用的,而且在被引用生成之后,其他的引用都是新的。
第二种其实是引用了一个副本文件!不管你在不在同一项目资源,只要是直接引用文件的这种,都实都是将文件到了object文件夹中,而这个文件夹的文件在生成时会生成到bin文件夹中!也有人理解为到了bin文件夹中,但是他们搞不清楚——类似于以上文件明明引用源中的dll已经更新,而bin中的怎么还是旧文件呢?其实文件引用方式是引用到项目中一个中间文件中了,这个文件并没有在vs上显示(文件组中存在,有些还是隐藏的),众所周知的是bin只有在编译的时候才会生成,所以很多人会以为源dll文件也是此时生成的,事实上根本上不是!而是你在引用时已经将文件到了隐藏的目录中!在生成时再将其到bin中!所以即引源文件夹的内容已经改变,这个文件也不会再发生错误了!如果这样理解了,那么楼主的问题就已经知道原因了!
如果是项目引用,不用管的,引用的永远是最新的dll!
如果是文件引用,在dll更新时,应该在项目中引用文件夹中找到文件,然后右击“刷新引用”即可!这个方式相当于再次从将源dll 到中间object目录中。当然,开发过程中使用的就是新的dll了!另一种方式更绝,就是删除引用文件,重新引用(这绝对可行,但怎么也不那么优雅,人家原因的dll位置又没换)!
如果让我根据楼主的描述,我猜你使用的也是文件引用方式!那么知道文件引用方式,怎么解决就不成问题了!
你一定奇怪,为什么还要有文件引用方式?我想引用哪个直接把那个项目添加到我的项目资源管理器中不就行了?就算两台机器上,一个dll也是,把整个的项目拷贝过来不也行吗(大多时候我们使用TFS时,可以直接将项目拉回来的)?为什么会存在这样文件引用呢?它的作用就为了解决我们拿不到源码无法添加到项目中而出现的引用方式吗?答案是肯定的,但只是一部分原因!我来告诉你另一部分的原因!
Fake!Fake!Fake! 如果你懂这个单词,那么一定知道我的意思,如果不懂我来告诉你吧,这个单词就是“假的”!如果dll开发是一个任务(develop task), 而引用该dll的应用软件或中间件也是一个任务(delevop task),在正常的开发关系上来说,dll开发任务是应用开发的前驱,也就是正常的需要dll开发完成后才进行应用软件的开发(很多人的模式都是这样的),但现在情况是,dll开发需要5天,而应用开发也需要5天,产品却要7天内交付!那么是说两个任务要同时进行develop! 怎么办?怎么办?应用开发程序员却说你没dll让我怎么引用——听起来很有道理,不少管理者向dll开发team压压力,你们在两天内加班完成,我给你们放5天假!事实上两天内加班完成的dll其实质量可想而知!为什么不Fake呢!
Fake的意思就是应用开发人员引用一个“假的”dll! 标记为Fake的引用文件非常好玩——你可以在开发中试一下!它只需要在成品是组合一下就可以了(因为引用文件会使用其文件的版本/哈希值/空间等相关校验,而这个即更是更新后的文件也存在有些值不一样——如publicToken值,而引用Fake则就是解决了这个问题)!
所以说文件引用的方式同时还是打破任务前驱方式的一种行为,有利于扁开化安排开发时间!所以文件引用也存在其实必要的因素!
无源码时的引用(只提供了dll没提供源码),比如某些SDK等,一般用于稳定的成熟的,基本上更新不大的dll文件使用。
分支版本控制(由于开发过程中存在诸多的分支版本)应用程序员无法分清楚或不需分清楚分支版本时,引用源码则会对应用开发造成一定的混淆,当然在dll开发立场上他们当然知道该用哪个版本的源码,对于应用开发的team,没有必要增加他们学习时间。各版本的区别他们并不知道细节。
Fake引用!并行开发成为可能性(虽然可以引用另一个团队的dll源码,如果你愿意每次生成时都更新他们的源码——他们有可能同时在改动,还要以无比的关爱来忍受他们的千奇百怪的bug的话,我同意,当然还得忍受这种原因导致你自己的进度缓慢)。
也正是因为如此,所以文件引用可能会出现的现象要知道怎么处理。
⑶ 易语言 如何把dll文件编译到EXE(如图)
易语言有一个可以添加DLL命令的地方,只要你的命令接口没有变,里面的函数随你改
修改窗口属性也一样,将你的窗口句柄传过去,根据句柄该窗口组件属性的方法就很多了,
如果你的DLL也是使用易语言写的话那就更简单了,
直接定义一个变量类型为窗口
.版本 2
.子程序 ABC, , 公开
.参数 要修改的窗口, 窗口
要修改的窗口.左边 = 0
要修改的窗口.高度 = 500
⑷ 如何编译DLL文件
好了 怎么给你?邮箱?
⑸ 如何编译64位dll程序,有几种情况,在32位XP上用VC++6.0或者VS2010该怎么编译64位的dll。
在64位的操作系统上用vs软件编译的dll默认就是64位。
在32位XP上用VC++6.0编译64位的dll,需要安装sdk(最新版本是sdk2003),在开始菜单——sdk——open build environment window——windows server 2003 64-bit build environment——set win svr 2003 x64 build env进入命令行,从命令行调用msdev,将vc选项里的include和lib的第一个默认路径设为sdk目录下64位头文件和库的路径,编译出的dll似乎就是64位的了。这个是从网页上看到的,没实践过。
在32位XP上使用vs2010就简单多了,新建一个项目(解决方案),加入代码,设置X64,编译生成即可。
⑹ 怎样可以将DLL编译到EXE文件里
添加一个自定义资源类型,指向该文件即可。运行时可以利用资源管理函数把资源存到Windows的临时目录,文件名称越怪越好,不需要和原来的文件名一样。利用loadLibrary和GetProcAddress,调用函数,最后删除临时文件,毁尸灭迹。如果你熟悉DLL动态延迟加载,那将是再好不过。 相关文章可以参考Windows Deveoper Magazine中 2002.7 这篇文章讲述了如何把DLL打包到一个EXE文件中,如何把它存到一个临时的不为人所知目录,如何动态延迟加载这个动态连接库(注意动态延迟加载用的是是静态连接,不需要调用loadLibrary和GetProcAddress函数,但在编译时需要指定编译选项你可以参考《Windows核心编程》参考关于DLL延迟加载的描述)。程序函数调用完毕程序退出前可以神不知鬼不觉地把文件删除。做到踏雪无痕。
⑺ 如何把dll文件反编译修改之后的文件编译成dll
你在你的solution中新建一个工程,然后把a.cs,b.cs,c.cs添加到这个工程里面(我建议你新建类,然后把类的代码过去,这样即使命名空间不同也不会造成混乱)
然后再你引用的工程里addreference->project->你新建的这个工程,就可以调用了.
这样如果你需要修改的话直接在ide里修改,可以实时看到效果
⑻ DLL文件是怎样生成的
由编译器编译源代码生成的啦。在开发软件的时候,把那些常用的方法,组织在一个类里面编译成dll文件,方便以后调用呢
⑼ C#中怎么将dll静态编译到exe中
在项目栏里面有个引用文件夹,右键点击文件夹,添加应用,在提示栏里上方标签点击
浏览
,选择dll路径即可,前提是dll没有加壳。
这只是项目里引用,你如果要在代码里用dll的方法(函数),先用对象浏览器(工具栏里有)查看dll里的类,当然,如果是你自己编的dll就不用了,再在代码源文件头加using
XXX(类别名称);即可。
提醒下~你编译出的exe如果要移动或打成安装包,dll要一起。
⑽ 一个应用程序里有很多DLL是怎么编译出来的
DLL就是功能独立出来的软件包,主要就是为了实现程序功能模块的分割,一个DLL可以同时在系统中被多个EXE进程映射,而时间上在内存中的拷贝只有一份。
DLL和EXE一样都是PE文件。
比如你的控制台程序(EXE的)要引用第三方的软件包,你就 可以将他们提供的lib文件加入到你的程序中,使用“#pragram comment(lib,"xxx.lib") ”——如果对方提供有.h文件,也要将其在包含在cpp的前面,或者延迟加载“LoadLibrary / GetProcAddress / FreeLibray ”,
自己也可以做个dll,导出函数、类、变量,等
任何一个程序都默认包含了系统的几个dll库文件。