c->使用 dll 中的本机函数时的 C# 数据类型转换

发布于 2024-11-14 16:33:20 字数 587 浏览 0 评论 0原文

这个列表正确吗?

unsigned int(c) -> uint(c#)
const char*(c) -> String(c#)
unsigned int*(c) -> uint[](c#)
unsigned char*(c) -> byte[](c#)

我认为这里有一个错误,因为使用本机函数的这 4 个参数,我有 PInvokeStackImbalance。

C 函数是:

bool something
  (unsigned char *a,
   unsigned int a_length,
   unsigned char *b,
   unsigned int *b_length);

PInvoke 是:

[DllImport(@"lib.dll", EntryPoint = "something")]<br>
public static extern bool something(
    byte[] a,
    uint a_length,
    byte[] b,
    uint[] b_length);

Is this list correct?

unsigned int(c) -> uint(c#)
const char*(c) -> String(c#)
unsigned int*(c) -> uint[](c#)
unsigned char*(c) -> byte[](c#)

I think there's a mistake here because with these 4 parameters for native function I have PInvokeStackImbalance.

C function is:

bool something
  (unsigned char *a,
   unsigned int a_length,
   unsigned char *b,
   unsigned int *b_length);

PInvoke is:

[DllImport(@"lib.dll", EntryPoint = "something")]<br>
public static extern bool something(
    byte[] a,
    uint a_length,
    byte[] b,
    uint[] b_length);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

池木 2024-11-21 16:33:20

首先,PInvoke.net 是您的朋友。

其次,您的转换是正确的,只是您应该使用 StringBuilder 来处理将 char* 作为缓冲区来填充的函数([in out])。

您的堆栈不平衡可能是由于使用不同的调用约定造成的。 C# 的默认调用约定是 __stdcall,但您的 C 函数可能是 __cdecl。如果是这种情况,您需要添加 CallingConvention< /a> 到您的 DLLImport 属性。

编辑:另外,正如 Groo 指出的那样,如果 C 函数中的指针参数实际上只是指向 unsigned int 的指针(例如,而不是期望一个 int 数组) )那么你应该使用ref uint而不是int[]

First, PInvoke.net is your friend.

Second, You conversions are correct except that you should use a StringBuilder for functions that take a char* as a buffer to fill ([in out]).

Your stack imbalance may be due to the use of different calling conventions. The default calling convention for C# is __stdcall, but your C function is probably __cdecl. If that is the case you will need to add the CallingConvention to your DLLImport attribute.

EDIT: Also, as Groo pointed out, if the pointer arguments in your C function are actually just pointers to unsigned int (for example, as opposed to expecting an array of int) then you should use ref uint instead of an int[].

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文