「C++の応用 - C Sharp DLLの使用」の版間の差分

ナビゲーションに移動 検索に移動
260行目: 260行目:
   
   
     system("pause");
     system("pause");
    return 0;
}
</syntaxhighlight>
<br><br>
== Monoを使用する場合 ==
==== Monoのインストール ====
* RHEL
*: [[インストール - Mono|インストール - Mono(RHEL)]]を参照して、Monoをインストールする。<br>
* SUSE
*: [[インストール - Mono(SUSE)]]を参照して、Monoをインストールする。<br>
* Windows
*: [https://www.mono-project.com/download/stable/ Monoの公式Webサイト]にアクセスして、[Download Mono 64-bit (no GTK#)]を選択して、Monoをダウンロードする。
*: Monoをインストールする。
*: <br>
*: 必要ならば、スタートメニューのMonoプログラムグループ下に[Monoコマンドプロンプトを開く]ショートカットを作成する。
*: このショートカットは、Mono関連のパス情報がすでに設定されたコマンドシェルを起動するものである。
<br>
==== C#ライブラリの作成 ====
以下の例では、SampleLibraryという名前のライブラリを作成している。<br>
<syntaxhighlight lang="c#">
using System;
namespace SampleLibrary
{
    public class SampleClass
    {
      public void SampleMethod(int intValue, string stringValue)
      {
          Console.WriteLine($"Received int: {intValue}, string: {stringValue}");
      }
    }
}
</syntaxhighlight>
<br>
==== C++実行ファイルの作成 ====
<syntaxhighlight lang="c++">
#include <iostream>
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/debug-helpers.h>
int main()
{
    // ドメインの初期化
    MonoDomain* domain = mono_jit_init("SampleApp");
    // C#ライブラリのアセンブリの読み込み
    MonoAssembly* assembly = mono_domain_assembly_open(domain, "SampleLibrary.dll");
    // C#ライブラリのクラスとメソッドの取得
    MonoImage  *image      = mono_assembly_get_image(assembly);
    const char *className  = "SampleLibrary.SampleClass";          // "<名前空間名>.<クラス名>"を入力する
    const char *methodName = "SampleMethod";                      // メソッド名を入力する
    MonoClass  *klass      = mono_class_from_name(image, "", className);
    MonoMethod *method    = mono_class_get_method_from_name(klass, methodName, 0);
    // インスタンスの作成
    MonoObject *instance  = mono_object_new(domain, klass);
    mono_runtime_object_init(instance);
    // C#ライブラリのメソッドに引数がある場合 (以下の例では、第1引数 : int型、第2引数 : string型)
    int intValue            = 42;
    const char *stringValue = "Hello from C++";
    // 引数を格納する配列
    void *params[] = {
        &intValue,                            // int型へのポインタ
        mono_string_new(domain, stringValue)  // string型へのポインタ
    };
    // C#ライブラリのメソッドに引数がない場合
    void *params[] = { nullptr };
    // エラー情報が格納される変数
    MonoObject *exc = nullptr;
    // C#ライブラリのメソッドの呼び出し
    // C#ライブラリのStaticメソッド(引数あり)を呼び出す場合  -->  例: mono_runtime_invoke(method, nullptr, params, nullptr);
    // C#ライブラリのStaticメソッド(引数なし)を呼び出す場合  -->  例: mono_runtime_invoke(method, nullptr, nullptr, nullptr);
    // C#ライブラリのStaticメソッド(引数あり)、かつ、エラー情報不要で呼び出す場合  -->  例: mono_runtime_invoke(method, nullptr, params, nullptr);
    mono_runtime_invoke(method, instance, params, &exc);
    // エラーの確認
    if (exc != nullptr) {
        // エラー情報の取得
        MonoClass  *excClass      = mono_object_get_class(exc);
        MonoMethod *toStringMethod = mono_class_get_method_from_name(excClass, "ToString", 0);
        MonoString *errorMessage  = (MonoString*)mono_runtime_invoke(toStringMethod, exc, nullptr, nullptr);
        // エラーメッセージの出力
        const char *pstrErrMessage = mono_string_to_utf8(errorMessage);
        std::cout << "Error: " << pstrErrMessage << std::endl;
        mono_free(pstrErrMessage);
    }
    // ドメインの解放
    mono_jit_cleanup(domain);
   
   
     return 0;
     return 0;

案内メニュー