什么是正确的PInvoke签名的函数,它变参? [英] What is the proper PInvoke signature for a function that takes var args?

查看:149
本文介绍了什么是正确的PInvoke签名的函数,它变参?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

还有一个原生的功能:

int sqlite3_config(int, ...);

我想的PInvoke这个功能。目前,我有这样的声明:

I would like to PInvoke to this function. Currently, I have this declaration:

[DllImport("sqlite3", EntryPoint = "sqlite3_config")]
public static extern Result Config (ConfigOption option);

(结果和ConfigOption的形式是枚举枚举结果:INT {...}

其实我只关心这个函数的一个参数的版本,不需要其他的args。这是正确的?

I am actually only interested in the single parameter version of this function and don't need the other args. Is this correct?

我也很好奇,你将如何声明两个参数形式(也许需要2 IntPtrs?)。

I am also curious as to how you would declare the two argument form (perhaps it would take 2 IntPtrs?).

推荐答案

您需要使用__arglist关键字(这是无证),巴特#有一个的好看一下博客。

You need to use the __arglist keyword (which is undocumented), Bart# had a nice blog about it.

示例

class Program
{
    [DllImport("user32.dll")]
    static extern int wsprintf([Out] StringBuilder lpOut, string lpFmt, __arglist);

    static void Main(String[] args)
    {
        var sb  = new StringBuilder();
        wsprintf(sb, "%s %s %s", __arglist("1", "2", "3"));
        Console.Write(sb.ToString());
    }       
}

该是pinvoking可变参数方法没有标准的方法,大部分的解决方案将包装在几种方法,例如

The is no standard way of pinvoking vararg methods, most solutions will wrap it in several methods e.g.

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods1(String fmt, 
    String arg1);

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods2(String fmt, 
    String arg1, String arg2);

这篇关于什么是正确的PInvoke签名的函数,它变参?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆