gpt4 book ai didi

c# - 在 C# 和 DLL 之间传递数组数据(双向)

转载 作者:行者123 更新时间:2023-11-30 14:17:38 32 4
gpt4 key购买 nike

我有一些编译成 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# - 在 C# 和 DLL 之间传递数组数据(双向),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5708936/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com