C#→C++動的配列を渡す

Bonjour!!

 

先日副業案件で、C++のライブラリーをC#で使えるようにするということを

やっている中で、タイトルの部分で躓いたので、備忘録を残します。

 

 

通常C#→C++へ値を渡すのはマーシャリングをすればすんなり渡せたりするんですけど、

C++側で受け取るのがLISTで定義されていて、配列を渡すときはC++側とC#側のバイト数を

一致させないといけないのでとっても悩みました。

 

 

そこで参考にさせてもらったのが以下のサイトです。

https://www.shibuya24.info/entry/cs2cpp_array

 

手順としては以下の通りです。

①C#側で動的配列の長さ分メモリを確保

②C++側に配列のポインタを渡す

⓷C++側で渡した配列の中身をC++側の動的配列にコピーする

 

●C++側のソース

  1. #include <afx.h>
  2. #include <afxtempl.h>
  3. #include <iostream>
  4. CArray<int, int> carray;
  5. extern “C” {
  6.     __declspec(dllexport) void Array_func(int num ,int* array) {
  7.         for (int i = 0; i < num; i++) {
  8.             //copy value from array to carray
  9.             carray.Add(array[i]);
  10.             std :: cout << “carray[” << i << “] = ” << array[i] << std :: endl;
  11.         }
  12.     }
  13. }

 

 

●C#側のソース

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Runtime.InteropServices;
  7. using System.IO;
  8. namespace arraysample1
  9. {
  10.     class Program
  11.     {
  12.         //definition C++ method
  13.         [DllImport(“ArraySample2.dll”, EntryPoint = “Array_func”)]
  14.         public static extern void Array_func(int num, IntPtr array);
  15.         static void Main(string[] args)
  16.         {
  17.             //length dynamic array
  18.             int length;
  19.             int[] array;
  20.             List<int> list = new List<int>();
  21.             //add value to List
  22.             list.Add(1);
  23.             list.Add(2);
  24.             list.Add(3);
  25.             //transfer List to array
  26.             array = list.ToArray();
  27.             length = array.Length;
  28.             //keep memory for array size
  29.             IntPtr ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * length);
  30.             //copy array value to “ptr”
  31.             Marshal.Copy(array, 0, ptr, length);
  32.             //call C++ method
  33.             Array_func(length, ptr);
  34.             //release memory
  35.             Marshal.FreeCoTaskMem(ptr);
  36.         }
  37.     }
  38. }

 

 

 

●結果

 

C#側で増やした配列がきちんとC++側にわたってますね!

 

ではAu revoir!!