一 概念
运行时处于控制之下的代码称为托管代码,反之,在运行环境(runtime)之外运行的代码称为非托管代码。
平台调用(来自consuming unmanaged dll functions)是一个可以使托管代码调用在DLL中实现的非托管函数,例如那些win32 API。它找到和调用导出的函数,同时根据需要将函数的参数(整形,字符,数组,结构体等等)通过互操作边界(interoperation boundary)进行转换(marshal)。
平台调用依赖于元数据来定位导出函数,并在运行时进行参数封组装好(来自a closer look at platform invoke)。调用过程如下
<1> 定位到包含对应函数的DLL
<2> 将DLL加载进入内存
<3> 定位函数在内存中的数据,并将它的参数传递到栈上,根据需要进行数据封组
<4> 将控制权转交给非托管函数
二 具体操作
先看一个示例程序
在vs创建一个C++的win32的空dll项目dllTest,新建一个名为dllTest.cpp文件,添加如下代码
extern "C" __declspec(dllexport) int Add(int x, int y)
{
return x + y;
}
extern "C"