13,002
回編集
419行目: | 419行目: | ||
異なるランタイム環境でのメモリ管理の違いからくる制約を考慮して、C++とC#間でデータの受け渡しを行う場合は、適切な手法やデータ構造を選択する必要がある。<br> | 異なるランタイム環境でのメモリ管理の違いからくる制約を考慮して、C++とC#間でデータの受け渡しを行う場合は、適切な手法やデータ構造を選択する必要がある。<br> | ||
例えば、C#ライブラリ側で変更可能な値を戻り値として返し、それをC++で受け取る等の方法がある。<br> | 例えば、C#ライブラリ側で変更可能な値を戻り値として返し、それをC++で受け取る等の方法がある。<br> | ||
<br> | |||
以下の例では、C++側でint型とMonoString*型を定義して、C#ライブラリ側で値を変更している。<br> | |||
<syntaxhighlight lang="c++"> | |||
// ...略 | |||
// メソッド情報の取得 | |||
const char *methodName = "func"; | |||
auto method = mono_class_get_method_from_name(mainClass, methodName, 2); | |||
int intValue = 0; | |||
MonoString *stringMonoValue = nullptr; | |||
// 引数を格納する配列 | |||
void *params[] = { | |||
&intValue, | |||
&stringMonoValue | |||
}; | |||
// C#ライブラリのメソッドの呼び出し | |||
MonoObject* excObject = nullptr; | |||
mono_runtime_invoke(method, classInstance, params, &excObject); | |||
if (excObject) | |||
{ | |||
MonoString *excString = mono_object_to_string(excObject, nullptr); | |||
const char *excCString = mono_string_to_utf8(excString); | |||
std::cout << "メソッドの実行時における例外 : " << "excCString" << std::endl; | |||
mono_jit_cleanup(domain); | |||
return -1; | |||
} | |||
else | |||
{ | |||
// 第1引数のint型を参照にしてC#ライブラリ側で変更した場合 | |||
std::cout << intValue << std::endl; // 100を出力する | |||
// 第2引数のMonoString*型を参照にしてC#ライブラリ側で変更した場合 | |||
std::string retStringMonoValue = mono_string_to_utf8(stringMonoValue); | |||
std::cout << retStringMonoValue << std::endl; // "abcあいう"を出力する | |||
} | |||
// ...略 | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
public void func(ref int value1, ref string value2) | |||
{ | |||
value1 = 100; | |||
value2 = "abcあいう"; | |||
return; | |||
} | |||
</syntaxhighlight> | |||
<br> | <br> | ||