什么`从DLL导出函数'是什么意思?

cla*_*aws 2 .net com dll

我对dll知之甚少.我正在读一本关于COM的书.在哪个作者指的是什么Exporting a function from a DLL.他讲述了如何做到这一点,但他不知道它是什么或为什么要这样做?

他建议的方法是:a)标记函数extern "C" (不知道为什么?) b)创建一个DEF文件并在此DEF文件的EXPORTS部分添加函数名称.再也不知道为什么以及究竟发生了什么?

我不明白的另一件事是term symbols/ symbol table.

  1. 什么Exporting a function from a DLL意思?
  2. 什么是symbols/ symbol table

如果有人能用简单,清晰和详细的术语解释我,我将感激不尽.任何网站链接或教程也非常受欢迎.

编辑:

我在.NET中使用过DLL.其中我只包括使用命名空间行并将dll添加到引用并且它们工作.这是我知道如何使用dll的唯一方法.我不知道如何在.net中使用dll与在COM中使用它们不同.任何人都可以将.NET与.NET联系起来吗?

RAO*_*AOF 8

.NET中的DLL与本机DLL完全不同..NET DLL包含称为CIL的字节码,它具有足够的信息供其他程序(如csc编译器)使用,以计算出包含在其中的类,类型,接口等.

这与本机DLL完全不同.本机DLL包含二进制指令和大多数非结构化数据,并且(通常)无法确定数据的含义 - 例如,DLL中的某个位置可能是两个字节(十六进制),43 23并且无法判断是否程序会将这些解释为字符C#或整数17187或存储器地址,甚至是指向CPU的指令.

那么,继续你的问题:

  1. symbol table是DLL的一个元数据; 它告诉编译器/链接器如何转换void myDllFunc (int bar)为DLL中的地址.它基本上是一个查找表.从DLL导出函数就是如何告诉你想要在查找表中找到哪些函数 - 这些是其他代码能够调用的函数,因为它能够找到它们.记住 - 没有其他信息,没有办法告诉从哪里 myDllFunc开始.
  2. extern C因为名称解析过程,特别是C++如何处理函数重载,建议使用它.当你有两个功能:
int square (int x);
double square (double x);
Run Code Online (Sandbox Code Playgroud)

编译器需要某种方式来区分它们 - 名称"square"现在是模糊的,并且不能解析为单个代码地址.C++通过名称修改处理它- 编译器获取函数的名称square,然后添加一些与函数签名中的类型对应的魔术字符串.因此,例如,编译器可以将您的两个函数看作:

int int+square+int (int x);
double dbl+square+dbl (double x);
Run Code Online (Sandbox Code Playgroud)

它们现在不再含糊不清(真正的编译器不使用这么简单的方案).这里现在有两个问题:

  1. 你想把那个函数称为"square",而不是"int + square + int",更糟糕的是,
  2. 不同的C++编译器使用不同的名称修改规则.

为了便于互操作,人们通常会标记它们导出的函数extern C,这使得编译器使用C的命名规则,其中函数的名称不会被破坏.

编辑以解决注释: 声明函数签名extern C可解决名称重整问题,因为C没有名称重整.因为声明了两个函数,C可以在没有名称修改的情况下离开

int square (int x);
double square (double x);
Run Code Online (Sandbox Code Playgroud)

是一个错误 ; 编译器/链接器不必 - 也不会 - 处理这种歧义.

Exporting a function from a DLL只不过是将函数添加到符号表中.这使得DLL外部的代码可以调用该函数,因为现在外部代码可以查找函数启动的位置.因此,该功能被"导出",因为其他人可以调用它.