我总是在我的C#代码中引用DLL,但它们仍然有些神秘,我想澄清一下。这是关于DLL的一些大脑转储。
我理解DLL是一个动态链接库,这意味着另一个程序可以在运行时访问该库以获得“功能”。但是,请考虑以下带有Web.dll
和Business.dll
的ASP.NET项目(Web.dll
是前端功能,它引用类型和方法的Business.dll
。)
Web.dll
动态链接到Business.dll
的时间点是什么时候?在使用Word(等)时,你会注意到很多Windows硬盘驱动器看似小的任务,我认为Word正在关闭并动态链接其他DLL的功能?
1a上。另外,什么加载和链接DLL - 操作系统或某些运行时框架,如.NET框架?
1b中。什么是“链接”的过程?是否进行兼容性检查?加载到同一个内存?链接实际意味着什么?
实际执行DLL中的代码是什么意思?它是由处理器执行还是在处理器理解DLL中的代码之前还有另一个转换或编译阶段?
2a上。对于使用C#.NET构建的DLL,运行它的是什么:.NET框架或操作系统直接?
Linux中的DLL是否可以在Windows系统上运行(如果存在这样的事情),或者它们是否特定于操作系统?
DLL是否特定于特定框架?使用C#.NET构建的DLL是否可以由使用Borland C ++构建的DLL使用?
4A。如果4的答案是“否”那么DLL的重点是什么?为什么各种框架不使用自己的格式来链接文件?例如:.NET内置的.exe知道.abc的文件类型可以链接到其代码中。
返回Web.dll
/ Business.dll
示例 - 要获得类型的客户,我需要从Business.dll
引用Web.dll
。这必须意味着Business.dll
包含某种关于客户类实际是什么的规范。如果我在Delphi中编译了我的Business.dll
文件:C#会理解它并且能够创建一个客户类,或者是否有某种标题信息或者说“嘿抱歉你只能使用我来自另一个Delphi DLL“?
5a上。同样适用于方法;我可以在DLL中编写CreateInvoice()
方法,用C ++编译,然后从C#访问和运行它吗?什么阻止或允许我这样做?
关于DLL劫持的问题,当然,替换(坏)DLL必须包含正在被劫持的方法签名和类型。我想如果你能找到原始DLL中可用的方法,那就不难了。
6a上。在我的C#程序中决定我是否可以访问另一个DLL?如果我的被劫持的DLL包含与原始DLL完全相同的方法和类型,但它是用另一种语言编译的,那么它会起作用吗?
什么是DLL导入和DLL注册?
答案 0 :(得分:64)
答案 1 :(得分:7)
.dll文件包含可在应用程序中使用的已编译代码。
有时,用于编译.dll的工具很重要,有时则不然。如果您可以在项目中引用.dll,那么使用哪个工具来编写.dll的公开函数并不重要。
链接发生在运行时,不像静态链接库,例如你的类,它们在编译时链接。
您可以将.dll视为一个黑盒子,它提供您不希望自己编写的应用程序所需的内容。是的,有人理解.dll的签名可能会创建另一个包含不同代码的.dll文件,并且您的调用应用程序无法知道其中的差异。
HTH
答案 2 :(得分:5)
1)web.dll在什么时候动态链接到business.dll?您 在Windows硬盘驱动器中注意到很多看似小的任务 使用Word等,我认为这个Word会动态地消失 链接其他DLL的功能?
1)我认为你在加载链接时感到困惑。链接是在测试所有检查和平衡时确保所要求的内容可用。在加载时,部分dll被加载到内存中或换出到页面文件。这是您看到的高清活动。
动态链接与静态链接不同,在静态链接中,所有目标代码都在链接时放入主.exe中。通过动态链接,目标代码被放入一个单独的文件(dll)中,并在与.exe不同的时间加载。
动态链接可以是隐式的(即应用程序与导入库链接)或显式(即应用程序使用LoadLibrary(ex)加载dll)。
在隐式的情况下,/ DELAYLOAD可用于推迟加载dll,直到应用程序实际需要它为止。否则,作为进程初始化的一部分,至少将其一部分加载(映射到进程地址空间)。该DLL也可以请求 在进程处于活动状态时永远不会卸载它。
COM使用LoadLibrary加载COM dll。请注意,即使在隐式情况下,系统也会使用与LoadLibrary类似的内容在进程启动时或首次使用时加载dll。
2)实际执行DLL中的代码是什么?它会被执行吗? 处理器还是有另一个翻译或编译阶段 在处理器理解DLL内的代码之前?
2)Dll包含与.exes类似的对象代码。 dll文件的格式几乎与exe文件的格式相同。我听说在两个文件的标题中只有一个不同的位。
对于使用C#.net构建的DLL,.Net框架正在运行它。
3)来自Linux的DLL是否适用于Windows系统(如果是这样的话) 存在)或他们是否特定于操作系统?
3)DLL是特定于平台的。
4)它们是否特定于特定框架?可以使用构建DLL C#.Net由使用Borland C ++构建的DLL(仅限示例)使用?
4)如果特别小心或者写了一些额外的粘合代码,Dll可以与其他框架互操作。
当公司销售多种具有重叠功能的产品时,Dll非常有用。例如,我维护一个光栅i / o dll,该公司使用了30多种不同的产品。如果您安装了多个产品,则dll的一次升级可以将所有产品升级为新的栅格格式。
5)回到web.dll / business.dll示例。上课 我需要从web.dll引用business.dll的客户类型。这个 必须意味着business.dll包含某种规范 客户类实际上是什么。如果我编译了我的business.dll 文件说Delphi会C#理解它并且能够创建一个 客户类 - 或者是否存在某种标题信息或其他内容 那说“嘿,对不起,你只能用我的另一个delphi dll”。
5)根据平台的不同,dll的功能以各种方式呈现,通过.h文件,.tlb文件或.net上的其他方式。
6)关于DLL劫持的问题,肯定是替换(坏)DLL 必须包含确切的方法签名,类型为 被劫持我想如果你能找到的话,这很难做到 原始DLL中有哪些方法可用。
6)dumpbin / exports和dumbin / imports是在.exe和.dll上使用的有趣工具