.net - `Exporting a function from a DLL` 是什么意思?

标签 .net com dll

我对dll不太了解。我正在读一本关于 COM 的书。哪个作者指的是Exporting a function from a DLL .他告诉了如何做到这一点,但他没有告诉它是什么或为什么应该这样做?

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

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

  • Exporting a function from a DLL 是什么意思意思是?
  • 什么是symbols/symbol table ?

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

    编辑:

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

    最佳答案

    .NET 中的 DLL 与 native DLL 完全不同。 .NET DLL 包含称为 CIL 的字节码,它为其他程序(例如 csc 编译器)提供了足够的信息来计算其中包含的类、类型、接口(interface)等。

    这与 native DLL 完全不同。 native DLL 包含二进制指令和大部分非结构化数据,并且(通常)无法确定数据的含义 - 例如,DLL 中的某处可能是两个字节(十六进制)43 23并且无法判断程序是否会将这些解释为字符 C#或整数17187或内存地址,甚至是一条要馈送到 CPU 的指令。

    所以,继续你的问题:

  • symbol table是 DLL 的一段元数据;它告诉编译器/链接器如何转换 void myDllFunc (int bar)到DLL中的地址。它基本上是一个查找表。从 DLL 导出函数是您如何知道您希望在该查找表中结束哪些函数 - 这些是其他代码将能够调用的函数,因为它将能够找到它们。记住——没有其他信息,就无法知道 myDllFunc 的位置。开始。
  • extern C推荐是因为名称解析的过程,特别是 C++ 如何处理函数重载。当你有两个函数时:
  • int square (int x);
    double square (double x);
    

    编译器需要某种方式来区分它们——名称“square”现在是模棱两可的,不能解析为单个代码地址。 C++ 通过名称修饰来处理这个问题——编译器采用你的函数名称,square ,然后在函数签名中添加一些对应于类型的魔术字符串。因此,例如,编译器可以将您的两个函数视为:
    int int+square+int (int x);
    double dbl+square+dbl (double x);
    

    而且它们现在不再模棱两可(真正的编译器不使用如此简单的方案)。现在这里有两个问题:
  • 您想将该函数称为“square”,而不是“int+square+int”,更糟糕的是,
  • 不同的 C++ 编译器使用不同的名称修饰规则。

  • 为了使互操作更容易,人们通常用 extern C 标记他们导出的函数,这使得编译器使用 C 的命名规则,其中函数的名称不会被破坏。

    编辑以解决评论:
    声明函数签名extern C解决了名称重整问题,因为 C 没有名称重整。由于声明了两个函数,C 可以在不修改名称的情况下逃脱
    int square (int x);
    double square (double x);
    

    是一个错误;编译器/链接器不必——也不会——处理这种歧义。
    Exporting a function from a DLL无非就是将函数添加到符号表中。这使得 DLL 外部的代码可以调用该函数,因为现在外部代码可以查找函数的开始位置。因此,该函数被“导出”,其他人可以调用它。

    关于.net - `Exporting a function from a DLL` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1939255/

    相关文章:

    windows - SysAllocString/SysFreeString COM 函数需要调用 CoInitialize?

    C++ CoCreateInstance 方法返回 "No Such Interface supported"

    c# - 从 c# 代码传递结构引用以调用在其原型(prototype)中接受结构引用的 c++ DLL 函数

    linux - 在 Linux 上创建 .SO 文件,而不使用 PIC(位置无关代码)(x86 32 位)

    c# - PropertyChanged 事件测试 : is this a good way?

    通过 .NET 的 jQuery AJAX POST - JSONP 返回

    c# - 如果状态码不等于 200 OK,则使用 Polly 重试 api 请求

    C++ 接口(interface)的 .NET 实现,暴露给 COM

    python - python 中 COM 对象的正确类型提示是什么?

    javascript - Uncaught Error : [$http:badreq] Http request configuration url must be a string (AngularJS)