передача многомерного массива из C # в C ++ DLL

0

Я добавляю функциональность к существующей библиотеке C++, которая будет вызываться из интерфейса С#. код открыт с обоих концов.

Мне нужно передать простой размерный многомерный массив из интерфейса в DLL.

например, в С#:

byte[, ,] arrayKeys = new byte[3, 2, 4] { 
{ {0x01, 0x23, 0x45, 0x55}, {0xCD, 0xEF, 0x12} }, 
{ {0x9A, 0xBC, 0xDE, 0xAA}, {0x78, 0x90, 0xCD} }, 
{ {0x67, 0x89, 0xA0, 0x98}, {0x90, 0x11, 0x22} }};

я исследовал онлайн, но на самом деле не нашел ничего, что точно соответствует моим параметрам. Большинство, которые я нашел, это 2D-массивы. если я что-то пропустил, пожалуйста, не стесняйтесь предоставлять существующую ссылку.

есть ли участие маршалинга? могу ли я передать массив напрямую или есть какой-то тип указателя массива, необходимый для C++?

  • 0
    Какие параметры? Как выглядит функция C ++?
  • 0
    это не существует Я расширяю функциональность DLL, поэтому она широко открыта. я все еще новичок в C #. в C ++ я бы написал что-то вроде этого. void someFunc (byte arrayData [] [2] [4]) {}
Теги:
multidimensional-array
marshalling

2 ответа

1

Вы можете отправить IntPtr массива и его размеры в функцию cpp.

byte[, ,] arrayKeys = new byte[3, 2, 4] { 
{ {0x01, 0x23, 0x45, 0x55}, {0xCD, 0xEF, 0x12} }, 
{ {0x9A, 0xBC, 0xDE, 0xAA}, {0x78, 0x90, 0xCD} }, 
{ {0x67, 0x89, 0xA0, 0x98}, {0x90, 0x11, 0x22} }};

byte oneDimensionArray = new byte[2*3*4];
for (int i=0; i<2; i++)
{
   for (int j=0; j<3; j++)
   {
      for (int k=0; k<4; k++)
      {
         oneDimensionArray[i*12+j*4+k] = arrayKeys[i,j,k];
      }
   }
}
IntPtr pBytes;
pBytes = Marshal.AllocCoTaskMem(2*3*4/*array dimensions*/);
//Copy data to allocated memory
Marshal.Copy(oneDimensionArray, 0, pBytes, i*j*k);
//Send memory pointer to C++ function
SendArrayToCPP(pBytes, i, j, k);
//free array memory
Marshal.FreeCoTaskMem(pBytes);
  • 0
    нашел решение, очень похожее на это. Спасибо за чаевые.
0

Если код открыт на обоих концах, посмотрите на тип данных SAFEARRAY, рекомендованный для автоматизации.

Здесь вы можете найти ссылку MSDN.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню