gpt4 book ai didi

c# - 从 C# 代码调用带有 void *参数的 native C++ 函数

转载 作者:行者123 更新时间:2023-12-03 12:50:30 26 4
gpt4 key购买 nike

我有一个 native C++ 函数,必须从 C# 代码中调用它,C++ 函数如下所示:

__declspec(dllexport) int getCameraFrame(void *buffer);

在 C++ 中调用该函数如下所示:

unsigned char* data = new unsigned char[640 * 480 * 4];
getCameraFrame(data);

从 C# 中,我使用 PInvoke 导入函数:

[DllImport("CameraSDK.dll")]
public static extern int getCameraFrame(???);

我在这里使用什么作为参数,以及如何从我的 C# 代码中调用该函数?

byte[] buffer;
getCameraFrame(out buffer); //???

更新

我尝试使用 string、byte[]、char[]、IntPtr 作为参数,但我不断收到 PInvokeStackImbalance 异常。

A call to PInvoke function 'Test!Test.Form1::getCameraFrame' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

更新 - 已解决

根据 David 和 Michael 的回答,我成功使用以下代码解决了我的问题

[DllImport("CameraSDK.dll", CallingConvention.Cdecl)]
public static extern int getCameraFrame([Out] StringBuilder buffer);

StringBuilder data = new StringBuilder(1024 * 768 * 4)
int result = getCameraFrame(data);

David,你的答案确实是正确的,请注意,我的 StringBuilder init 是 1024 * 768 * 4 (而不是 640 * 480 * 4 - 这就是引发 AccessViolationException 的原因) - 在 C++ 代码中,缓冲区是从 ( 1024 * 768 * 4) 到 (640 * 480 * 4) - 我一定错过了那部分,所以,这是我的错。

我能够获取原始数据,但无法将其转换为位图(原始数据采用某种奇怪的格式),但这是另一个问题。

谢谢

最佳答案

我有以下工作代码:

C++ 定义:

__declspec(dllexport) void SendRenderedImage(byte buffer[]);

C# 声明

[DllImport("External.dll", EntryPoint = "SendRenderedImage", CallingConvention = CallingConvention.Cdecl)]
public static extern void SendRenderedImage(
[MarshalAs(UnmanagedType.LPArray)] byte[] buffer
);

C# 用法:

SendRenderedImage(new byte[10]);

希望有帮助。

关于c# - 从 C# 代码调用带有 void *参数的 native C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677172/

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