こんにちは、Unityエンジニアのオオバです。

C#とC++間のデータやりとりを
実装したことありますか?

Unityが提供する機能を普通に使っているだけだと、
あまり出てこないシチュエーションかも知れません。

Unityが提供していない機能にアクセス といった
Unityの外へ一歩出ようとすると
C++や別の言語が必要になります。

今回はC#とC++間のデータのやり取りシリーズ2回目。
C#からC++に対して int型 を渡してみます。

環境構築は前回記事を参考にどうぞ。

あわせて読みたい記事

C#からC++に文字列を渡す方法

C++はint型で受け取り可能

C#からC++にintを渡す方法_0

C++へのint型の送信はシンプルです。
C#からC++へそのまま渡すことができます。

なぜならint型などのプリミティブ型変数を保持するメモリは
C++側と同じアンマネージドメモリだからです。

つまり値を変換する必要がないのです。

このようなプリミティブ型は
int型同様そのままC++へ渡せます。

では具体的な処理を解説していきます。

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

C++はint型で受け取るメソッド定義

C#からC++にintを渡す方法_1

C#と同じint型で受け取れるため
C++のコードはとてもシンプルです。

C++側のコードから見ていきましょう。

💻ソースコード : TestDll.cpp
#include "stdafx.h"
#include <iostream>
// C#から実行される関数の定義  
DllExport void TestInt(const int value);  

void TestInt(const int value)  
{
    std::cout << value << std::endl;  
}

前回の文字列を渡す際はポインタで受け取っていましたが、
今回はint型、プリミティブ型です。

C#からプリミティブ型を渡す際は、
ポインタではなく値型でそのまま受け取れます。

C#からint型をそのまま送信する

C#からC++にintを渡す方法_2

C#のコードを見ていきましょう。

[DllImport("TestDll.dll", CallingConvention = CallingConvention.Cdecl)]  
static extern void TestInt(int value);  

static void Main()  
{
    TestInt(999);  
}

int型の値をそのまま送るだけ です。
特に説明はありません。

オオバ
オオバ
int型の送信はとってもカンタンですね!

他のプリミティブ型

C#からC++にintを渡す方法_3

プリミティブ型はint型問わず
そのままC++へ値を送信できます。

以下は浮動小数点float型の送信例です。

C++の処理

💻ソースコード : TestDll.cpp
#include "stdafx.h"
#include <float.h>
#include <iostream>
// C#から実行される関数の定義  
DllExport void TestFloat(const float value);  

void TestInt(const float value)  
{
    std::cout << value << std::endl;  
}

C#の処理

[DllImport("TestDll.dll", CallingConvention = CallingConvention.Cdecl)]  
static extern void TestInt(int value);  

static void Main()  
{
    TestFloat(100.5f);  
}

このようにfloat型をC#からC++に送信できます。

まとめ : C#からC++にintを渡す方法

C#からC++にintを渡す方法_4

C#とC++間でのint型やり取りは、
とくに意識することはありません。

C#/C++間でやり取りする独特な記述に慣れていきましょう。

オススメ記事
検証環境
参考サイト