risc-v中文社区

 找回密码
 立即注册
查看: 731|回复: 0

[原创] C#调用c/c++生成的dll中的可变参数函数

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-6-7 16:29:04 | 显示全部楼层 |阅读模式
今天遇到一个基础问题:用c/c++代码生成的dll库,在c#中需要用到这个dll库,而且dll库中有函数的参数是可变长度,那么c#中如何声明呢?在解决这个问题之前,大家要明白一件事情:这里提到的可变参数方法,指的是具有 CallingConventions.VarArgs 调用约定的方法,而不是包含 params 参数的方法。
C/C++ 中的函数形式
void fun(unsigned int arg1, const char *format, ...);
C# 中的调用方法
方法1:使用__arglist
使用可变参数列表。

[DllImport("dlllib.dll", CallingConvention = CallingConvention.Cdecl
public static extern void fun(uint arg1, string message, __arglist);
...
调用时:
fun(4, "Hello %s %d %c", __arglist("argA",6,'a'));

注意参数使用的是 __arglist 关键字,并未指定任何参数类型和参数名称,调用方法时,也必须将可变参数用 __arglist() 括起来,


可变参数方法在调用时,也要特别注意即使不传递任何可选参数,也必须写 __arglist(),而不能省略掉。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-30 20:24 , Processed in 0.019793 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表