如何解决在C#和DLL双向之间传递数组数据
|| 我有一些可以编译为DLL的C代码。从C#中,我需要将一个整数数组传递给它,并且需要从中获取一个整数数组。 这是我到目前为止的内容。在C#中,唯一起作用的函数是bar()。它返回22并按预期写入文件。其他人正确地写入他们的文件,但是在将控制权交还给C#时抛出异常。读着 \“对PInvoke函数的调用'irhax!irhax.App :: foo \'使堆栈不平衡。这可能是因为托管的PInvoke签名与非托管的目标签名不匹配。请检查PInvoke的调用约定和参数签名与目标非托管签名匹配。\“ C(DLL):#define IG_API __declspec(dllexport)
IG_API void foo(int i) {
FILE *f = fopen(\"foo.txt\",\"a+\");
fprintf(f,\"%d\\n\",i);
fclose(f);
}
IG_API int bar(void) {
FILE *f = fopen(\"bar.txt\",\"bar!\\n\");
fclose(f);
return 22;
}
IG_API void transmitIR(unsigned *data,int length) {
FILE *f = fopen(\"transmit.txt\",\"a+\");
for(int i = 0; i < length; ++i)
fprintf(f,\"%d,\",data[i]);
fprintf(f,\"\\n\");
fclose(f);
}
IG_API int receiveIR(unsigned *data,int length) {
for(int i = 0; i < length; ++i)
data[i] = 4;
return length;
}
C#(调用方):
[DllImport(\"Plugin.dll\")]
static extern void foo(int i);
[DllImport(\"Plugin.dll\")]
static extern int bar();
[DllImport(\"Plugin.dll\")]
static extern void transmitIR(uint[] data,int length);
[DllImport(\"Plugin.dll\")]
static extern int receiveIR(out uint[] data,int length);
我在这里不知所措。我究竟做错了什么?由于我什至无法使foo(int)正常工作,因此这似乎是一个不错的起点。解决方法
您的C代码使用cdecl调用约定。 C#代码使用stdcall。
所有的
DLLImport
属性应为:
[DllImport(\"Plugin.dll\",CallingConvention=CallingConvention.Cdecl)]
当然,您也可以使用__stdcall
将C代码切换为stdcall。但是请确保只执行其中一项!
receiveIR
不需要out
。您应该声明:
static extern int receiveIR(uint[] data,int length);
,您知道C函数的调用约定吗?就像错误所说的那样,可能是不匹配。默认的调用约定是stdcall,但是如果这些函数使用cdecl约定,则可能会出现此错误。尝试
[DllImport(\"Plugin.dll\",CallingConvention=CallingConvention.Cdecl)]
static extern void foo(int i);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。