Unity DLL 集成中 C# 和 C++ 之间的字节数组和 int 传输

问题描述 投票:0回答:1

我正在开发一个 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++ 平台之间的字节顺序差异。

c# c++ arrays unity-game-engine dynamic-memory-allocation
1个回答
0
投票

您需要将调用约定声明为 CDecl,返回值应为

IntPtr
,因为您需要它来处理您收到的
Cv:Mat

[DllImport("utility", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr MyCppFunction(byte[] messagePtr, int messageSize);

数组不需要固定,除非预计函数将在调用的生命周期之外使用。编组器将自动将其固定为调用本身。

如果您正在做的话,请考虑使用适当的 OpenCV 托管库。

© www.soinside.com 2019 - 2024. All rights reserved.