我与一些第三方dll合作。 这个第三方dll是C ++代码,他的一个方法签名需要有数组并用正确的值填充这个数组。
看起来像这样
struct Val
{
public int v1;
public int v2;
}
UpdateValues(Val[] arrayToUpdate, int length);
因此,第三方dll获取数组(非空数组)并更新此数组的每个项的值。
我不知道如何在c#代码上定义此方法签名。
(我是通过使用PInvoke来实现的)
答案 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);
}
从C#我们可以这样称呼它:
_moviRadio = new CMoviRadioUM();
_moviRadio.Movi_radio_send_message(..., Encoding.UTF8.GetBytes(data));
要传递一组更复杂的结构,比如struct或class,我相信你需要将它转换成简单对象或指针的数组,因为Native C ++库对你的Manager一无所知