winform 动态调用dll_简单说一下动态库和静态库

a715ec0b8b6580ed97ef13945656aab6.png

发现非技术的小伙伴经常被一些技术名词困扰,今天说一下静态库和动态库。以下都以 Windows 系统上的文件后缀和格式为例,各系统原理上都是一样的。

全称其实是静态链接库和动态链接库,一个最简单的程序产生过程是这样的:

a9f97c57f5154a0b5150f415a96cf551.png

静态链接库(.lib),就是一堆 .obj 文件的组合(简单组合),最后里面所有的 .obj 都“链接”到一个 exe 文件中,这样 exe 会比较大,但是因为依赖关系简单(一个 exe 文件就能运行了),可移植性会更好,同时因为在一个文件中,所以执行也会更快。

动态链接库(.dll),obj 的功能(就是里的的函数)被“链接”到一个 dll 中,这个 dll 在文件格式上和 exe 是一样的(Windows 上都是 PE 格式,操作系统认识并处理这个格式),然后 exe 在执行的过程中按需“动态”加载这个 dll,调用完毕也可以动态卸载这个 dll。这样主程序 exe 会很小,所以启动会更快,同时 dll 因为是单独的文件,所以功能可以复用,也可以单独修改,整个软件的模块化也好。

动态链接库可以理解为把程序拆成了几部分,静态链接库可以理解了把所有程序运行需要的东西都塞到一个文件中(这么说不严谨,因为还有系统的功能,但不影响理解)。

从软件保护的视角看

动态库的使用“是 exe 调用 dll”,从模式化的角度通常我们会把需要复用的、经常修改的、可以拆卸的、功能相近的函数放在一个 dll 中,但是从直觉上也能感觉出来,这样 exe 和 dll 之间的边界是非常明显的,所以使用动态库加密通常更难做,而且安全性也不如使用静态库。

那是不是从安全的角度都应该使用静态库?并不尽然!

  • 首先,只有那些可以编译成本地程序的语言才能用静态库,本地程序就是我们通常所说的 exe,操作系统可以直接执行(.NET程序也可以编译成 exe,一些脚本也可以通过工具打包成 exe,但他们都要依赖 .NET 框架和相关的脚本解释器才能执行,操作系统不能直接执行,所以并不是本地程序),对应的语言最典型的就是 C/C++,以前还有 Delphi,但是现在国内用得人很少了。
  • 其次,模块化和加密是需要平衡的,并不是所有的情况都要牺牲大量的软件工程便利性,来换取加密效果的。平衡取舍在各个领域甚至是生活中往往都是最重要

作为一家 SDK 厂商,我们通常在一个操作系统上提供的就两种库:一种是动态库、一种是静态库。所以不同语言的 API 就是一个怎么调用这些库的接口,API 可以理解为就是库的说明书,最基础形式的就 是C/C++ 的”头文件“,里面说明了库里包含的函数,C/C++ 可以直接使用,当然,既可以使用静态库也可以使用动态库。以前 Delphi 大行其道,也会提供静态库(因为格式需要稍微调整,所以单独提供了,和普通的并没有本质区别)。

其它的几乎所有语言都只能使用动态库:.NET、Java、Python、PHP……,理论上客户直接调用就行了。但是我们还是提供了 .NET、Java 等的“接口”,一方便为了方便客户,拿来即用,但最主要的还是因为客户自己调用因为对数据不熟悉,经常出错(最常见就是结构体对齐等问题),为了统一客户的使用方式也降低服务量,我们通常会提供单独的相关语言接口,其实它们更像是“DEMO”或“最佳实践”,也有很多人不使用“原厂”的封装,直接自己调用动态库的。

细节很多,比如还有导入库、导出库之类的概念,但是我觉得对于非技术的小伙伴来说,以上知道已经足以应付像卖 SDK 这种销售工作了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值