自动导出

[开源世界]从自动导出动态链接库接口看C++的缺点

流过昼夜 提交于 2019-11-27 19:12:44
自动导出动态链接库接口在C++编程中绝对是一件烦人的事情,因为你不得不大量的重复以下几个步骤: 1.加载动态链接库 2.定义导出函数指针定义 3.定义导出函数指针变量 4.从动态链接库中导出函数 5.编写导出函数的封装函数 6.卸载动态链接库 有很多人试图将这个过程自动化,然而全部折戟沉沙。我认为终极原因在于动态链接库在导出函数的时候没有包含参数信息,而在使用的时候不得不将导出函数进行强制转型。 在C#中导出动态链接库的函数相比C++来说要简单的多: 1. 使用DllImportAttribute属性规定导出函数的文件路径、导出点、堆栈调用方式等 2.定义导出函数的C#函数原型 说简单是代码简单,不是实现过程简单。从表面上看,C#的这两部实现了C++的那6步,从原理上来看,C#仍然需要C++的那6步。C#的编译器把2、3、4、5的步骤封装了,在C#代码编译成中间语言的时候进行了展开。C#在定义导出函数的函数原型的时候需要做一件事,就是判断C#参数类型和C++参数类型的对应关系,为什么要特别注意这一点呢?就是因为C#在展开的时候需要准确的C++函数定义,否则调用过程中会出现错误。 Java中有一个能够调用本地动态链接库的组件——JNative,虽然我没有看过它具体是怎么实现的,但是从我了解到的只字片语中推断JNative参考了C#的实现过程并原模原样的复刻了一份—