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)

相关推荐

  • 菜价肉价飞涨,菜价上涨太快了,意味着什么

    近期,国内多地出现“菜比肉贵”现象。在同一个超市,出现了一斤菠菜的钱可以买两斤猪肉或三斤鸡肉的情况,成为很多网友关注的一个热点。

    生活 2021年10月26日
  • 风电行业龙头股,风电产业三大龙头

    这个文章比较长,所以分为多次陆续登出来。作为明后年最确定的方向之一,还是有必要好好了解一下的。

    生活 2021年11月18日
  • iphone11 基带坏,iphone12基带坏了

    视频加载中...

    科技 2021年12月9日
  • 有遗传致病基因的父母如何生出健康的后代?武汉大学人民医院团队给出了解决方案。

    父母都是遗传性疾病的基因携带者,如不加干涉自主孕育的话,极有可能导致孩子出生即患有先天性疾病。为有效解决遗传病给生育带来的健康隐患,11月22日,武汉大学人民医院(湖北省人民医院)正式成立遗传病生殖优生优育MDT诊疗小组(简称遗传病生殖MDT)。这一MDT团队将以第三代试管婴儿技术为基础,依托多学科联手为这些家庭实现优生优育愿望。

    生活 2021年11月24日
  • 生活也许就这样,像梦一场,生活是一场梦

    孩子最大的噩梦是什么? 我已经不是小孩子了,很难知道自己的判断是否正确。 成年人总有一个误区,认为自己曾经是孩子,所以理解孩子并不难,只是把自己过去的经历放在眼前的情境中。 我觉得...

    生活 2021年11月16日
  • 2000元左右性价比高的手机推荐

    根据京东、淘宝等网站数据统计,每年到双十一、双十二阶段,各大平台纷纷推出各种政策。大部分青年人,追求实用与高性价比。两千元左右仍是高销量阶段,但是想选一台性价比高的手机,多数人都必须精挑细选来比较。我们来看一下2021年的爆款手机,非常适合入手,内存大,容量大,全部都是256G大内容。用3-4年没问题。

    科技 2021年11月24日