C#→C++動的配列を渡す
Bonjour!!
先日副業案件で、C++のライブラリーをC#で使えるようにするということを
やっている中で、タイトルの部分で躓いたので、備忘録を残します。
通常C#→C++へ値を渡すのはマーシャリングをすればすんなり渡せたりするんですけど、
C++側で受け取るのがLISTで定義されていて、配列を渡すときはC++側とC#側のバイト数を
一致させないといけないのでとっても悩みました。
そこで参考にさせてもらったのが以下のサイトです。
→https://www.shibuya24.info/entry/cs2cpp_array
手順としては以下の通りです。
①C#側で動的配列の長さ分メモリを確保
②C++側に配列のポインタを渡す
⓷C++側で渡した配列の中身をC++側の動的配列にコピーする
●C++側のソース
- #include <afx.h>
- #include <afxtempl.h>
- #include <iostream>
- CArray<int, int> carray;
- extern “C” {
- __declspec(dllexport) void Array_func(int num ,int* array) {
- for (int i = 0; i < num; i++) {
- //copy value from array to carray
- carray.Add(array[i]);
- std :: cout << “carray[” << i << “] = ” << array[i] << std :: endl;
- }
- }
- }
●C#側のソース
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Runtime.InteropServices;
- using System.IO;
- namespace arraysample1
- {
- class Program
- {
- //definition C++ method
- [DllImport(“ArraySample2.dll”, EntryPoint = “Array_func”)]
- public static extern void Array_func(int num, IntPtr array);
- static void Main(string[] args)
- {
- //length dynamic array
- int length;
- int[] array;
- List<int> list = new List<int>();
- //add value to List
- list.Add(1);
- list.Add(2);
- list.Add(3);
- //transfer List to array
- array = list.ToArray();
- length = array.Length;
- //keep memory for array size
- IntPtr ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * length);
- //copy array value to “ptr”
- Marshal.Copy(array, 0, ptr, length);
- //call C++ method
- Array_func(length, ptr);
- //release memory
- Marshal.FreeCoTaskMem(ptr);
- }
- }
- }
●結果
C#側で増やした配列がきちんとC++側にわたってますね!
ではAu revoir!!