【发布时间】:2018-05-01 19:03:27
【问题描述】:
我正在为基于 C 的库实现 c#.net 包装器。目前,正在处理传递 A void 指针的函数,该指针将设置值。
注意: void 指针可以根据 Enum 采用不同的数据类型。
目的:传递void指针并设置值
我检查了许多要实施的解决方案,最终达到以下状态:
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);
通过这种方法,它只设置输入
asd中的第一个字符a。
我已经检查了“重复”问题,但没有解决问题:
【问题讨论】:
-
什么是
StringToHGolbalUni? -
function_call() ...function_Call()是否有大小写更改的原因? -
@WaiHaLee 其在 MSDN 上 msdn.microsoft.com/en-us/library/…
-
char name[255]; name = "asd";无效 C. -
Marshal.StringToHGlobalAnsi() 应该是下一个猜测。为这些方法编写重载,以便您可以将枚举类型与预期的参数类型配对。现在您可以简单地使用字符串而不是 IntPtr。看在皮特的份上,贴出你实际尝试过的代码。
标签: c# c pointers marshalling void-pointers