如何传递需要用C ++代码填充的数组?

时间:2015-07-12 19:28:29

标签: c# pinvoke

我与一些第三方dll合作。 这个第三方dll是C ++代码,他的一个方法签名需要有数组并用正确的值填充这个数组。

看起来像这样

 struct Val
 {
       public int v1;
       public int v2;
 }

 UpdateValues(Val[] arrayToUpdate, int length);

因此,第三方dll获取数组(非空数组)并更新此数组的每个项的值。

我不知道如何在c#代码上定义此方法签名。

(我是通过使用PInvoke来实现的)

1 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是在C ++ / CLI(托管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#中的Char数组传递给C ++的示例如下所示: 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);
    }
  1. 从C#我们可以这样称呼它:

    _moviRadio = new CMoviRadioUM();
    _moviRadio.Movi_radio_send_message(..., Encoding.UTF8.GetBytes(data));
    
  2. 要传递一组更复杂的结构,比如struct或class,我相信你需要将它转换成简单对象或指针的数组,因为Native C ++库对你的Manager一无所知