我正在开发一个 Unity 项目,在其中我用 C++ 创建了一个 DLL 以与我的 C# 脚本集成。我编写的 C++ 函数旨在接收字节数组及其大小作为输入参数。但是,我遇到了一个问题,C# 中的字节数组和字节数组长度与 C++ 中收到的数据不同,导致出现意外行为。
这是我的 C# 和 C++ 代码的简化版本:
C#代码
void OnMessageReceived(CommsMessage message) {
byte[] frameDataByteArray = message.payload.ToByteArray();
int frameDataLength = frameDataByteArray.Length;
Debug.Log("Frame length in C# is: " + frameDataLength);
byte[] output = MyCppFunction(messagePtr, frameDataLength);
}
[DllImport("utility", CallingConvention = CallingConvention.Cdecl)]
public static extern byte[] MyCppFunction(byte[] messagePtr, int messageSize);
C++代码
cv::Mat MyCppFunction(const unsigned char* messagePtr, int messageSize) {
std::cerr << "Received message size in C++: " << messageSize << std::endl;
// Additional processing...
}
当我用 C# 和 C++ 打印长度时,就会出现问题。 C# 中的长度是正确的,但 C++ 中的 messageSize 变量似乎不正确,显示出明显更大的值。
我还假设我传入的 byte[] 受到此问题的影响,但我无法正确测试它。我对 C++ 不太精通,所以我假设有一些明显的解释可以解释为什么内存被损坏。另外,我还需要从 C++ 接收返回的 byte[] 以便在我的 C# 脚本中使用。我希望第一期的答案能够引导我找到下一期的答案。但如果您也能在这方面提供帮助,我将不胜感激。
我怀疑这可能是由以下原因之一引起的:
数据类型不匹配:之间的数据类型可能不匹配 C# 和 C++,导致字节数组的解释不正确 尺寸。
内存管理问题:可能存在内存管理问题, 例如内存损坏或不正确的指针使用,导致 C++ 函数中的大小会被扭曲。
字节顺序问题:值的差异可能是由于
C# 和 C++ 平台之间的字节顺序差异。
您需要将调用约定声明为 CDecl,返回值应为
IntPtr
,因为您需要它来处理您收到的 Cv:Mat
值
[DllImport("utility", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr MyCppFunction(byte[] messagePtr, int messageSize);
数组不需要固定,除非预计函数将在调用的生命周期之外使用。编组器将自动将其固定为调用本身。
如果您正在做的话,请考虑使用适当的 OpenCV 托管库。