c->使用 dll 中的本机函数时的 C# 数据类型转换
这个列表正确吗?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,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 achar*
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 yourDLLImport
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 ofint
) then you should useref uint
instead of anint[]
.