dll动态调用和静态调用有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dll动态调用和静态调用有啥区别相关的知识,希望对你有一定的参考价值。

我用C#调用C++的dll静态调用和动态调用有什么区别 感觉动态的要麻烦些还要用loadlibrary 应该不一样吧 谁来说说 谢谢

一).静态调用其步骤如下:
1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;
2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;
3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目
录下;
4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;
5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然
后在Object/library modules输入框中输入:youApp.lib
6.选择你的目标工程Head Files加入:youApp.h文件;
7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"
注:youApp是你DLL的工程名。

2.动态调用其程序如下:
动态调用时只需做静态调用步骤1.

HINSTANCE hDllInst = LoadLibrary("youApp.DLL");
if(hDllInst)

typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC youFuntionNameAlias = NULL; // youFuntionNameAlias 函数别名
youFuntionNameAlias = (MYFUNC)GetProcAddress
(hDllInst,"youFuntionName");
// youFuntionName 在DLL中声明的函数名
if(youFuntionNameAlias)

youFuntionNameAlias(param1,param2);

FreeLibrary(hDllInst);


采用动态库技术对于升级软件版本更加容易。与静态库(Static Link Library)不同,动态库里面的函数不是执行程序本身的一部分,而是根据执行需要按需载入,其执行代码可以同时在多个程序中共享。
(1)静态调用,也称为隐式调用,由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码(Windows系统负责对DLL调用次数的计数),调用方式简单,能够满足通常的要求。通常采用的调用方式是把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只须在源文件中声明一下。
LIB文件包含了每一个DLL导出函数的符号名和可选择的标识号以及DLL文件名,不含有实际的代码。Lib文件包含的信息进入到生成的应用程序中,被调用的DLL文件会在应用程序加载时同时加载在到内存中。
(2)动态调用,即显式调用方式,是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,比较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。在Windows系统中,与动态库调用有关的函数包括:
①LoadLibrary(或MFC 的AfxLoadLibrary),装载动态库。
②GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。
③FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库。
参考技术A   二者的区别:
  1、静态调用时,如果exe所在的文件夹没有dll文件及其lib文件,则运行exe会报错。及exe根本就运行不起来 ,系统提示没有找到dll文件等信息。错误信息是不可控的。
  2、动态调用只有再调用dll文件时,如果没有,才会报错,并且此错误时可控的。
  如果dll没有对应的.lib文件,那么就只能使用动态加载的方式了。

IIS(动态和静态)缓存、OutPutCache 和浏览器缓存有啥区别

【中文标题】IIS(动态和静态)缓存、OutPutCache 和浏览器缓存有啥区别【英文标题】:What are difference between IIS (Dynamic and Static) cache,OutPutCache and browser cacheIIS(动态和静态)缓存、OutPutCache 和浏览器缓存有什么区别 【发布时间】:2012-03-28 15:46:03 【问题描述】:

IIS (Dynamic and Static)缓存、OutPutCachebrowser cache有什么区别?

我想我对他们感到困惑。

浏览器是否缓存所有的js或css文件?

如果我使用 IIS 缓存而不使用 OutputCache 会发生什么?

如果我同时使用会发生什么?

【问题讨论】:

【参考方案1】:

OutPutCache 是一个页面/控件缓存,它保存在服务器上,以从该页面/控件的呈现中获得处理速度。

browser cache 是您在页面上设置的标题命令,并指示客户端浏览器将页面保留在客户端计算机缓存中一段时间​​,而不是从服务器读取。

static cache 用于为所有用户共同的内容设置缓存,Dynamic cache 用于为同一页面设置不同的缓存并取决于用户或其他参数。你也可以说静态是不变的内容(例如图像,html页面等)的缓存,动态是像aspx页面一样变化的内容的缓存。

IIS 可以为图像和所有此类不变的内容设置缓存,并且您对浏览器说要保留“长时间”。

你需要使用所有缓存的组合来获得最好的结果并且不是什么用什么不可以。变化不大的静态内容缓存多,动态内容缓存少。

浏览器是否缓存所有 js 或 css 文件?

浏览器只做你说他做的事情。因此,您需要在浏览器的页眉上设置您希望浏览器将此文件保留在客户端缓存中的时间。如果您没有设置任何内容,则 IIS 会为 Js 和 Css 和图像等静态内容设置文件创建日期,浏览器可以使用它来询问服务器是否需要再次读取它。

静态和动态

关于静态和动态缓存的更多信息是动态缓存上的浏览器询问服务器是否需要更新,如果答案是肯定的,则再次读取页面。这样浏览器总是调用服务器,但并不总是取回内容。

另一种方式是静态的,在这个缓存中浏览器缓存内容并且从不要求服务器重新读取它。例如,对于静态内容的图像,您设置了一个大缓存,并且浏览器不再询问服务器,而是使用客户端缓存中的图像。

您可以在 web.config 上设置此静态内容缓存

<staticContent>
    <clientCache cacheControlMaxAge ="8.00:00:00" cacheControlMode="UseMaxAge" />
</staticContent>

浏览器的动态缓存是您需要以编程方式创建的东西。您在标头上设置一个参数,当浏览器请求内容时,您读取此参数并决定要重播的内容、新内容或从缓存中读取的命令。

一些例子:Create ETag filter in ASP.NET MVC

http://jagbarcelo.blogspot.com/2009/03/conditional-get-and-etag-implementation.html

Generating etags for images in asp.net?

 if I use both IIS cache and OutputCache?

其实这是两个不同的想法,由他们自己行动。让我们看看发生了什么的一些步骤。

Client A Browser : 请给我页面default.aspx

服务器响应:好的,请稍等。让我看看我在 OutpuCache 上有没有?不,我现在制作并将其保存到 OutPutCache。现在我发给你。 (waiting time 600 ms + 70ms Network Lag) + 2000ms to download the mage

Client B Browser:请给我页面default.aspx

服务器响应:好的,请稍等。让我看看我在 OutpuCache 上有没有?是的,我从缓存中读取并发送它。 `(等待时间 100 ms + 70ms 网络延迟)+ 2000ms 下载法师

客户端A浏览器:请给我页面default.aspx,我最后的缓存说该文件的日期:12/Mar/2012。

服务器响应 : hmm 你不需要重新读取它,因为它没有被修改,使用你的本地缓存。 (waiting time 80 ms + 70ms Network Lag) + 0ms to download the page

在 OutputCache 上找到页面时,用户不会等待页面开始显示这么多东西。

当页面发现没有修改时,效果是用户几乎看对了页面,因为没有等待页面下载。

当内容是静态的(如图像)并在缓存中找到时,浏览器会以正确的方式显示它而无需询问服务器,因此这是用户查看本地缓存中内容的更快方式。

【讨论】:

谢谢,但是如果我同时使用 IIS 缓存和 OutputCache 会发生什么?当请求到达服务器时,服务器上发生了什么?你能解释更多细节吗?如果我使用OutputCache,我的页面将缓存,当我使用 IIS 缓存时,似乎 IIS 缓存了缓存:-? .请解释更多 如果我希望我的 JSCSS 被缓存,我最好的选择是什么? @Kerezo 我将它们缓存为静态,带有两天的客户端缓存,最后是版本号,这样我就可以在更新时正确更改它们。我不会将它们缓存为完全静态的。但这是一个新的(很好的)问题,可以获得更多信息,因为我有很多代码。 @Kerezo 右键单击​​此页面并查看源代码,以查看我希望将它们缓存为静态并使用版本控制的内容。查看 js 和 css 目录和文件上的数字。 非常感谢亲爱的@Aristos。但在场景中你没有考虑IIS Cache。我的意思是当请求来到 IIS 并缓存页面时,它是否检查 OutPuCache ?如果我在 IIS 中使用 user-mode cache 并将其时间设置为 30 分钟,并且在我的页面中我使用 Outputchache 并将其时间设置为 15 分钟,如果用户在 16 分钟后请求会发生什么? IIS 7 中的user-modekernel-mode 缓存有什么区别?谢谢

以上是关于dll动态调用和静态调用有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

扩展名为dll的文件是啥意思啊?有啥用?

单例模式 静态库和动态库的区别

关于动态库和静态库的问题。

好C++中lib 和 dll 的区别生成以及使用详解

Delphi Dll 动态调用例子-仔细看一下

opencv静态链接库有啥用