gpt4 book ai didi

C# 从 CPP 调用未知数量的参数的 CPP 函数

转载 作者:太空狗 更新时间:2023-10-29 21:31:24 25 4
gpt4 key购买 nike

我在 CPP 中有一个函数,其原型(prototype)如下:

char* complexFunction(char* arg1, ...);

我使用 DLLImport 属性从 C# 导入它。问题是:我如何在 C# 中定义原型(prototype)(在 DLLImport 属性下)?我如何将参数传递给这个函数?谢谢

最佳答案

这称为可变参数函数。关于对它们的 P/Invoke 支持的信息相当稀少,这是我发现的。

我找不到直接 DllImport 参数数量可变的函数的方法。我必须将参数的 DllImport 所有变体 作为不同的重载。

我们以wsprintf为例.它在 winuser.h 中具有以下原型(prototype):

int WINAPIV wsprintf(      
LPTSTR lpOut,
LPCTSTR lpFmt,
...);

它可以像这样在 C# 中使用:

using System;
using System.Text;
using System.Runtime.InteropServices;

class C {

// first overload - varargs list is single int
[DllImport("user32.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int wsprintf(
[Out] StringBuilder buffer,
string format,
int arg);

// second overload - varargs list is (int, string)
[DllImport("user32.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int wsprintf(
[Out] StringBuilder buffer,
string format,
int arg1,
string arg2);

public static void Main() {
StringBuilder buffer = new StringBuilder();
int result = wsprintf(buffer, "%d + %s", 42, "eggs!");
Console.WriteLine("result: {0}\n{1}", result, buffer);
}
}

现在处理您的 complexFunction

char* complexFunction(char* arg1, ...);

它的可变参数列表应该以同样的方式处理:通过提供所有有用的重载。但还有另一个复杂因素——返回类型。我假设 complexFunction 分配并返回 char 数组。在这种情况下,调用者很可能负责数组的释放。为此,您还应该导入释放例程,我们称它为 void free(void*)

假设所有这些假设,使用 complexFunction 的 C# 代码将如下所示:

using System;
using System.Text;
using System.Runtime.InteropServices;

class C {

[DllImport("your.dll",
CallingConvention=CallingConvention.Cdecl,
CharSet=CharSet.Ansi)]
static extern IntPtr complexFunction(
string format,
int arg1, int arg2);

[DllImport("your.dll", CallingConvention=CallingConvention.Cdecl)]
static extern void free(IntPtr p);

public static void Main() {
IntPtr pResult = complexFunction("%d > %s", 2, 1);
string sResult = Marshal.PtrToStringAnsi(pResult);
free(pResult);
Console.WriteLine("result: {0}", sResult);
}
}

关于C# 从 CPP 调用未知数量的参数的 CPP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/214953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com