【问题标题】:C# - Marshall & Pass void pointer to C function calling from C#C# - Marshall & 将 void 指针传递给从 C# 调用的 C 函数
【发布时间】: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

我已经检查了“重复”问题,但没有解决问题:

c++ - What is void* in C#

How to declare void pointer in C#

void* in C#

【问题讨论】:

  • 什么是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


【解决方案1】:

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

[MarshalAs(UnmanagedType.LPStr)] StringBuilder var

而不是IntPtr

您应该会发现它按预期工作,但请注意您的 C 函数期望的 char 数组的大小。在您调用 C 函数之前,您的 StringBuilder 变量的声明中可能有一个明确的大小,如下所示:

StringBuilder newvar= new StringBuilder(512);

解释了使用 StringBuilder 而不是 String 或 IntPtr 的情况的良好链接解释了 here - 感谢 Amy 的链接

【讨论】:

  • 你的意思是String而不是StringBuilder
  • 不。字符串生成器
  • 我找到了this,这就解释了你为什么使用StringBuilder
  • @Grantly 如果您提供的答案与一个合理的程序员所期望的答案不同,那么您很自然会收到 cmets 询问您为什么要这么说。拒绝回答这些 cmets 会使您的回答毫无用处。读者无从得知这个答案是否有用。
  • @Amy 这解释了为什么在将字符串从非托管代码复制到托管代码时使用StringBuilder。这里的 OP 是将字符串从托管代码复制到非托管代码。我认为您第一次就做对了,这不是使用StringBuilder 的理由。
【解决方案2】:

问题已通过以下方式解决:

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

name = Marshal.StringToHGolbalAnsi(val);

在客户端:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2017-08-30
    • 2011-04-17
    • 2012-10-06
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多