代码之家  ›  专栏  ›  技术社区  ›  Remotec

动态链接库中有什么,它是如何工作的?

  •  73
  • Remotec  · 技术社区  · 14 年前

    我一直在引用我的C代码中的DLL,但它们仍然是一个谜,我想澄清一下。这是一种有关DLL的问题的大脑转储。

    我了解动态链接库是一个动态链接库,这意味着另一个程序可以在运行时访问这个库以获得“功能”。但是,考虑下面的ASP.NET项目 Web.dll Business.dll ( Web.DLL 前端功能和IT参考 业务DLL 对于类型和方法)。

    1. 在什么时候 Web.DLL 动态链接到 业务DLL ?当使用Word(等)时,您会注意到Windows HDD中有很多看似很小的任务需要反复执行,我认为Word会关闭,并动态链接其他DLL的功能?

      1a.另外,什么加载和链接DLL—操作系统或一些运行时框架,如.NET框架?

      1b.什么是“链接”的过程?是否进行了兼容性检查?加载到同一个内存中?链接实际上意味着什么?

    2. 什么实际执行DLL中的代码?它是由处理器执行的,还是在处理器理解DLL中的代码之前,存在另一个翻译或编译阶段?

      2a.对于C.NET中内置的dll,直接运行.NET框架或操作系统是什么?

    3. Linux中的dll是否在Windows系统上工作(如果存在这样的东西),或者它们是特定于操作系统的?

    4. DLL是否特定于特定框架?使用C.*.NET构建的DLL可以被用Borland C++构建的DLL使用吗?

      如果对4的回答是“否”,那么动态链接库的意义是什么?为什么不同的框架不为链接文件使用它们自己的格式?例如:内置.NET的.exe知道.abc文件类型是可以链接到其代码中的。

    5. 回到 Web.DLL / 业务DLL 示例-要获取客户的类类型,我需要参考 业务DLL Web.DLL . 这一定意味着 业务DLL 包含某种关于客户类实际上是什么的规范。如果我编译了我的 业务DLL 比如说,Delphi文件:C是否理解它并能够创建一个客户类,或者是否有一些头信息或者说“嘿,对不起,你只能从另一个Delphi DLL使用我”?

      5a.同样适用于方法;我可以写一个 CreateInvoice() 方法在DLL中,用C++编译,然后从C++中访问并运行它。什么阻止或允许我这样做?

    6. 在动态链接库劫持的问题上,替换(坏)动态链接库必须包含被劫持的方法签名和类型。我想,如果您能找出原始dll中可用的方法,这就不难了。

      6a.在我的C程序中,什么决定我是否可以访问另一个DLL?如果我被劫持的dll包含与原始dll完全相同的方法和类型,但它是用另一种语言编译的,它会工作吗?

    什么是dll导入和dll注册?

    3 回复  |  直到 7 年前
        1
  •  63
  •   Matti Virkkunen    7 年前

    首先,您需要了解两种截然不同的DLL之间的区别。Microsoft决定同时使用.NET(托管代码)和本机代码使用相同的文件扩展名(.exe和.dll),但是托管代码DLL和本机DLL是 非常 内部不同。

    1)web.dll在什么时候动态链接到business.dll?你 注意到在Windows HDD中有很多看起来很小的任务在 用词等,我认为这个词是动态的 从其他DLL链接功能?

    1)对于.NET,在执行第一个尝试从DLL访问任何内容的方法时,通常按需加载DLL。这就是为什么如果无法加载dll,则可以在代码中的任何位置获取typenotfoundexceptions。当像Word这样的东西突然开始大量访问HDD时,它很可能会进行交换(获取已交换到磁盘的数据,以便在RAM中腾出空间)。

    1a)此外,加载和链接dll的内容-O/S或某些 运行时框架,如.NET框架?

    1a)对于托管DLL,.NET框架是加载、JIT编译(将.NET字节码编译为本机代码)和链接DLL的工具。对于本机dll,它是加载和链接dll的操作系统组件(不需要编译,因为本机dll已经包含本机代码)。

    1b)“链接”的过程是什么?有支票吗 兼容性?加载到同一个内存中?链接是什么 实际上是什么意思?

    1b)链接是指当调用代码中对dll中符号(例如方法)的引用(例如方法调用)替换为dll中事物的实际地址时。这是必要的,因为在将DLL加载到内存之前,无法知道它中事物的最终地址。

    2)什么实际执行DLL中的代码?它是由执行的吗 处理器,或者是否存在另一个翻译或编译阶段 在处理器理解DLL中的代码之前?

    2)在Windows上,.exe文件和.dll文件完全相同。本机.exe和.dll文件包含本机代码(与处理器执行的代码相同),因此不需要翻译。托管.exe和.dll文件包含.NET字节码,该字节码是第一个JIT编译(转换为本机代码)的字节码。

    2a)如果是从c.net构建的dll,那么运行它的是什么?这个 .NET框架还是直接操作系统?

    2a)代码经过JIT编译后,以与任何代码完全相同的方式运行。

    3)来自say linux的dll是否在Windows系统上工作(如果这样的话) 是否存在)或者它们是特定于操作系统的?

    3)只要两个平台上的框架都是最新的,并且编写DLL的人没有故意使用本机调用破坏兼容性,托管DLL就可以按原样工作。由于格式不同(即使内部机器代码相同,如果它们都适用于同一处理器平台),本机DLL的工作方式与中不同。顺便说一下,在Linux上,“dlls”被称为.so(共享对象)文件。

    4)它们是否特定于特定框架?可以使用 NET使用Borland C++构建的DLL(仅示例)?

    4)托管DLL是.NET框架特有的,但它们自然可以与任何兼容语言一起工作。只要每个人都使用相同的约定(调用约定(如何在机器代码级别传递函数参数)、符号命名等),本机DLL就可以兼容。

    5)返回web.dll/business.dll示例。获得一个班级 我需要从web.dll引用business.dll的客户类型。这个 必须表示business.dll包含某种类型的规范 真正的客户类是什么?如果我编译了business.dll 文件中的say delphi将C理解它,并能够创建一个 客户类-或者是否有某种标题信息或其他内容 上面写着“嘿,对不起,你只能从另一个DelphiDLL中使用我”。

    5)托管DLL包含它们所包含的每个类、方法、字段等的完整描述。Afaik Delphi不支持.NET,因此它将创建本地DLL,而不能直接在.NET中使用。您可能可以使用PInvoke调用函数,但找不到类定义。我不使用delphi,所以我不知道它如何用dll存储类型信息。例如,C++依赖于包含类型声明的头(.h)文件,并且必须与DLL一起分发。

    6)关于动态链接库劫持的主题,肯定是替换(坏)动态链接库 必须包含准确的方法签名,类型为 被劫持。如果你能找到 找出原始dll中可用的方法等。

    6)实际上,如果您可以轻松地切换DLL,就不难做到这一点。可以使用代码签名来避免这种情况。为了让某人替换签名的dll,他们必须知道签名密钥,而签名密钥是保密的。

    6a)这里有一个重复的问题,但这可以追溯到 C程序正在决定是否可以访问另一个DLL?如果我被劫持的DLL 包含与原始方法和类型完全相同的方法和类型,但它 是用另一种语言编译的,可以吗?

    6a)只要是用任何.NET语言生成的托管dll,它就可以工作。

    • 什么是dll导入?和DLL注册?

    “dll导入”可以有很多意思,通常是指引用一个dll文件并在其中使用它。

    动态链接库注册是在Windows上完成的一项操作,它将动态链接库文件作为COM组件进行全局注册,使其可用于系统上的任何软件。

        2
  •  7
  •   BenMorel mehmet cinar    11 年前

    .dll文件包含可在应用程序中使用的已编译代码。

    有时用于编译.dll的工具很重要,有时不重要。如果您可以在项目中引用.dll,则使用哪个工具来编写.dll公开的函数并不重要。

    链接发生在运行时,与静态链接库(如类)不同,静态链接库在编译时链接。

    你可以把.dll看作一个黑盒子,它提供了你的应用程序不想自己写的东西。是的,理解.dll签名的人可以创建另一个.dll文件,其中包含不同的代码,而您的调用应用程序不知道两者的区别。

    高温高压

        3
  •  5
  •   Marshal    9 年前

    1)web.dll在什么时候动态链接到business.dll?你 注意到在Windows HDD中有很多看起来很小的任务在 用词等,我认为这个词是动态的 从其他DLL链接功能?

    1)我认为您混淆了链接和加载。这个链接是当所有的检查和平衡都被测试,以确保所要求的是可用的。在加载时,部分DLL被加载到内存中或交换到页面文件中。这是您看到的高清活动。

    动态链接不同于静态链接,在静态链接中,所有的对象代码都在链接时放入main.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)来自say linux的dll是否在Windows系统上工作(如果这样的话) 是否存在)或者它们是特定于操作系统的?

    3)DLL是平台特定的。

    4)它们是否特定于特定框架?可以使用 NET使用Borland C++构建的DLL(仅示例)?

    4)如果特别注意或者编写了一些附加的粘合代码,则DLL可以与其他框架进行互操作。

    当公司销售多个具有重叠功能的产品时,DLL非常有用。例如,我维护一个光栅I/O DLL,该DLL被公司30多个不同的产品使用。如果安装了多个产品,则一次DLL升级可以将所有产品升级为新的光栅格式。

    5)返回web.dll/business.dll示例。获得一个班级 我需要从web.dll引用business.dll的客户类型。这个 必须表示business.dll包含某种类型的规范 真正的客户类是什么?如果我编译了business.dll 文件中的say delphi将C理解它,并能够创建一个 客户类-或者是否有某种标题信息或其他内容 上面写着“嘿,对不起,你只能从另一个DelphiDLL中使用我”。

    5)根据平台的不同,动态链接库的功能以各种方式呈现,包括.h文件、.tlb文件或.net上的其他方式。

    6)关于动态链接库劫持的主题,肯定是替换(坏)动态链接库 必须包含准确的方法签名,类型为 被劫持。如果你能找到 找出原始dll中可用的方法等。

    6)dumpbin/exports和dumbin/imports是用于.exe和.dlls的有趣工具。