如何传递需要由c++代码填充的数组
本文关键字:代码 填充 数组 c++ 何传递 | 更新日期: 2023-09-27 18:02:23
我使用一些第三方dll。这个第三方dll是c++代码,他的一个方法签名需要有一个数组,并用正确的值填充这个数组。
它看起来像这样
struct Val
{
public int v1;
public int v2;
}
UpdateValues(Val[] arrayToUpdate, int length);
因此,第三方dll正在获取数组(不是空数组)并更新该数组中每个项的值。
我不知道如何在c#代码中定义这个方法签名。实现这一点的一种方法是在c++/CLI (Managed c++)上创建一个中间层库,它将与本机c++库调用本身一起工作,但也为您的c#应用程序提供c#托管API。所以,在顶层,它会像这样工作:
Your C# app <-> C++/CLI middle lib <-> C++ native lib
你可以在我的开源项目https://bitbucket.org/optiklab/roboball中找到这样一个调用的例子,它是这样工作的:
FootballRobot C# app <-> RobotMoveLib C++/CLI <-> MoviRadioUM C++
那么,一个从c#到c++传递Char数组的例子是这样的:1. c++/CLI方法获取数组作为参数:
void CMoviRadioUM::Movi_radio_send_message(..., array<Byte> ^ msg)
{
// Convert to native format
pin_ptr<Byte> data = &msg[0];
unsigned char * pData = data;
// Native call to C++ lib passes Char *
movi_radio_send_message(..., &pData);
}
在c#中我们可以这样调用它:
_moviRadio = new CMoviRadioUM(); _moviRadio.Movi_radio_send_message(..., Encoding.UTF8.GetBytes(data));
传递更复杂结构的数组,如结构或类,我相信你需要将其转换为简单对象或指针的数组,因为本机c++库将不知道你的Manager