C# - Marshall 并将 void 指针传递给从 C# 调用的 C 函数

C# - Marshall & Pass void pointer to C function calling from C#

我正在为基于 C 的库实现 c#.net 包装器。目前,通过传递一个 void 指针来处理函数,这将设置值。

注意: void 指针可以采用不同的数据类型,具体取决于枚举。

Objective: to pass void pointer and set value

我检查了很多解决方案来实施,最后来到以下状态:

C-dll函数:

int function_call(enum a, void * var);

C函数调用代码:

char name[255];
name = "asd";
function_call(enum a, &name);

C# 包装器代码:

[DllImport("mylibrary.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int function_call(enum a, IntPtr var);

C#函数调用代码:

IntPtr name;
string val = "asd";
name = Marshal.StringToHGolbalUni(val);
int ret = function_call(Enum_type, name);

By this method it only sets First character a from the input asd.

我已经检查了 "Duplicate" 个问题,但没有解决问题:

c++ - What is void* in C#

How to declare void pointer in C#

void* in C#

我会将你的 void * 视为 char * 并使用

[MarshalAs(UnmanagedType.LPStr)] StringBuilder var

而不是 IntPtr

您应该会发现它按预期工作,但请注意您的 C 函数所需的 char 数组的大小。在您调用 C 函数之前,您的 StringBuilder 变量声明中的显式大小可能是这样的:

StringBuilder newvar= new StringBuilder(512);

很好 link 解释了使用 StringBuilder 代替 String 或 IntPtr 的情况 here - Thanks Amy 为 link

问题已解决:

[DllImport("mylibrary.dll", CharSet = CharSet.Ansi,  CallingConvention = CallingConvention.Cdecl)]

name = Marshal.StringToHGolbalAnsi(val);

在客户端:

IntPtr nameptr;
string name = "asd";
nameptr= Marshal.StringToHGlobalAnsi(name);