加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#和DLL之间传递数组数据(两个方向)

发布时间:2020-12-16 01:43:16 所属栏目:百科 来源:网络整理
导读:我有一些编译成DLL的C代码.从C#开始,我需要向它传递一个int数组,我需要从中获取一组int. 这是我到目前为止所拥有的.从C#开始,唯一有效的功能是bar().它返回22并按预期写入文件.其他人正确地写入他们的文件,但在将控制权交还给C#时抛出异常.它读, “调用PInvo
我有一些编译成DLL的C代码.从C#开始,我需要向它传递一个int数组,我需要从中获取一组int.

这是我到目前为止所拥有的.从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,"%dn",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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读