2015-07-12 56 views
0

我與一些第三方DLL一起工作。 這第三方DLL是C++代碼,他的一個方法簽名需要有數組,並用正確的值填充該數組。如何傳遞需要填充C++代碼的數組?

它的外觀像這樣

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

UpdateValues(Val[] arrayToUpdate, int length); 

因此,第三方DLL越來越數組(不空數組)並更新此數組中的每個項目的值。

我不知道如何在c#代碼上定義此方法簽名。

+0

你需要知道返回值,然後沒有別的..你使用PInvoke,那就是它 – Amit

+0

確實。你首先了解C++簽名,以及它是如何被調用的,這些還沒有提供。 –

回答

0

一種方式來實現這一點(我用的PInvoke這樣做)是建立在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#到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)); 
    
  • 要通過更復雜的結構的陣列,像結構或類,我相信你需要將其轉換爲簡單對象或指針數組,因爲本機C++庫將不知道你的經理

    +0

    通過串口傳遞數組很容易。爲什麼訴諸一個額外的程序集? –