在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\", \"a+\");
    fprintf(f, \"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);

要回复问题请先登录注册