为基于 Microsoft .NET Framework 精简版的应用程序编写非托管函数(转)

精简版.NET非托管DLL开发
本文介绍如何创建可在智能设备应用程序中使用的非托管动态链接库(DLL),重点讲解了在.NET Framework精简版中调用非托管代码时需要注意的问题,并提供了具体的代码示例。

摘要:学习如何创建可通过平台调用在智能设备应用程序中使用的非托管函数。

简介

编写 Microsoft .NET Framework 精简版应用程序时,有时需要调用非托管代码,才能直接与底层操作系统进行交互。.NET Framework 精简版中的非托管代码和托管代码之间的互操作性是 .NET Framework 完整版的子集。例如,.NET Framework 精简版不支持将代理用作回调函数。同样,.NET Framework 精简版也不支持完整的 COM 互操作性,因此,如果要在 .NET Framework 精简版中访问 COM 对象,必须编写非托管模块以将其作为包装程序,这样才能处理对 COM 对象和类型封送处理的调用。

编写从托管环境调用的非托管代码时,有几个问题需多加注意。本文介绍了这些注意事项,并提供了非托管动态链接库 (DLL) 的代码。

本文假定您熟悉 eMbedded Visual C++ 开发环境并了解 C++ 语言。

选择 eMbedded Visual C++ 3.0 项目类型

使用 eVC++ 时,您可以选择使用 WCE 动态链接库项目类型,也可以选择 WCE MFC 应用程序向导 (dll) 项目类型。前者用于简单的 DLL 项目,后者用于需要 Microsoft 基础类 (MFC) 功能的项目。为了说明有关开发在 .NET Framework 精简版中使用的非托管 DLL 的要点,本文将介绍如何使用 WCE 动态链接库项目类型。

托管代码只需要编译一次,就可以在安装了 .NET Framework 精简版运行时的任何移动设备上运行;非托管代码与之不同,必须为要支持的每个硬件平台编译单独的 DLL。在新建项目对话框中,必须选择希望在 DLL 中支持的处理器,eVC++ 将为每个选定的处理器平台编译单独的 DLL。eVC++ 编译器能够支持各种处理器,包括 ARM、MIPS、SH 和 x86。必须记住,要在模拟器中使用 DLL,您可能需要创建 Intel x86 版本的 DLL。

导出入口点

可以从 DLL 外部调用的任何函数都必须标记为导出函数。在 eVC++ 中,这可以通过为函数声明添加 _declspec(dllexport) 前缀来实现。此外,按照 WINAPI 调用约定来标记函数声明也很有用,因为这是 .NET Framework 精简版所支持的唯一调用约定。WINAPI 宏映射到 __cdecl 调用约定。同样,在 .NET Framework 精简版中,CallingConvention.Winapi 等同于托管的 WINAPI

以下示例显示了使用以上技术时 eVC++ 中的函数声明的外观:

_declspec(dllexport) int WINAPI MyFunction(int MyVal)
{
    // 在此处添加实现代码
    return 0;
}

从托管代码中调用此代码时,要按照以下格式声明代码中的非托管函数:

[DllImport("NativeDll.dll",EntryPoint="MyFunction")]
public static extern int MyFunction(int MyVal);

遗憾的是,由于“名称混成”的原因,此调用无法按照预期的方式进行。

处理 C++ 名称混成

在 Windows 的早期版本中,对象文件格式无法处理重载函数。为解决此问题,编译器根据函数名称和参数列表为每个函数生成一个唯一名称。这样就确保了每个函数对链接器都有一个唯一的名称。这种生成唯一名称的方法就叫做“名称混成”。MyFunction 的混成形式类似于 ?MyFunction@@YAJXZ

名称混成为要调用非托管代码的托管代码带来一个问题。每个编译器以不同的方式处理混成,因此很难了解导出入口点的确切名称。在 C++ 中,可以使用 extern "C" 声明强制编译器不进行名称混成,而是使导出函数的名称与源代码中的函数名称相匹配。

使用 extern "C" 声明时,C++ 函数示例如下所示:

extern "C" _declspec(dllexport) int WINAPI multiply(int n1, int n2) 
{ 
    // 返回 n1 和 n2 相乘后的值
    return(n1 * n2)
}

类型封送处理

.NET Framework 精简版支持托管代码与非托管代码之间的简单类型转换。有些类型不需要任何转换,这些类型称为“通用类型”。下表显示了可通用类型及其托管和非托管的等价类型。

C#Visual Basic .NETNative C/C++
IntIntegerint
shortShortshort
boolBooleanBYTE
charCharWCHAR

此外,您还可以将数组、结构和类传递给非托管代码。

更多信息

有关更多信息,请参阅以下资源:


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126340/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-126340/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值