如何传递需要由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++代码填充的数组

实现这一点的一种方法是在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