c++中函数调用,c++如何调用函数

主要方式C#主要通过两种方式提供对非托管代码的调用,第一种是使用平台调用(Platform Invoke,P/Invoke),第二种是使用不安全代码(unsafe),日常开发中我们使用最多的就是第一种,所以下面我们来介绍下如何使用平台调用。

主要方式

C#主要通过两种方式提供对非托管代码的调用,第一种是使用平台调用(P/Invoke),第二种是使用不安全代码(Unsafe),第一种是日常开发中使用频率最高的,下面我们来介绍一下如何使用平台调用。

平台调用

CLI通过P/Invoke提供此功能,允许API调用非托管dll所导出的函数.平台调用主要包括以下步骤:声明外部函数、映射数据类型、错误处理。

00-1010像类的所有普通方法一样,我们需要在类的上下文中声明目标API,同时给它添加一个extern修饰符,从而将其声明为外部函数。它几乎总是静态的(static).正如下面的代码所示,我们声明了外部函数SendMessage(位于user32.dll中),可以省略或写入EntryPoint属性,或者指定一个函数名来覆盖默认行为,CharSet属性用于指定是调用Unicode还是ASCII版本的API,还是自动尝试通过。NET平台。

使用系统;使用系统。运行时. InteropServices命名空间PayPlatformProxy { public class LevyTest {[DllImport(' user 32 . dll '),EntryPoint=' SendMessage ',CharSet=CharSet。Auto)])私有静态extern IntPtr send message(IntPtr HWnd,int Msg,IntPtr wParam,IntPtr lParam);}}

1. 声明外部函数

托管代码的基本类型不会随着处理器而改变。无论是32位还是64位处理器,int类型始终是32位,但是在非托管代码中,内存指针会随着处理器而变化。因此,c语言中的HANDLE和LPVOID等类型不能对应int,而应该对应IntPtr,int ptr的大小随处理器内存的布局而变化。微软官网文档类型封送处理有一个涉及类型的映射,大家可以参考研究一下。此外,pinvoke.net还有很多C#中系统API的声明例子。输入关键字以查看示例是如何映射的,从而完成从非托管类型到托管类型的映射。此外,C#中C方法的对应签名也可以由pinvoke-interop-assistant生成,我们将在示例的演示部分使用。

2. 数据类型映射

如下,我们定义了c的方法LevyAgeAdd,其目的是输入姓名和年龄,然后返回newAge和提示年龄增加的信息(resultMsg)。

extern ' C ' { _ declspec(dllexport)void levyagead(const char * name,int age,int* newAge,char * resultMsg);}接下来,我们在pinvoke-interop-assistant工具中输入C方法的声明,然后点击Generate生成对应C#方法的签名,如下图所示。

如何在C#中调用C++方法

然后我们通过C#代码调用这个C代码,先复制外部函数LevyAgeAdd的声明,然后调用方法传入每个参数值,如下所示:

[DllImport('Project1.dll ',EntryPoint=' LevyAgeAdd ',CharSet=CharSet。auto)]公共静态外部void levyageAdd([In()][Marshalas(unmanaged TYPe。LPStr)])字符串名称、int age、ref int newAge、int ptr resultMsg);void Main(){ int new age=0;IntPtr p=元帅。alloch global(255);//调用c方法LevyAgeAdd('杨晓斗',25,ref newAge,p);字符串结果消息=封送。PtrToStringAnsi(p);$ Newage的值为: {newAge}。dump();“$ resultMsg”的值是: {resultMsg}”。dump();}输出结果如下图:所示。

如何在C#中调用C++方法

哈哈,调用结果正确!真香!事实上,我们的C代码的实现确实将年龄增加了3岁,然后输出提示信息。希望这篇文章能对童鞋有所帮助!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/44871.html

(0)

相关推荐