MRS Room セットアップ

本文書はMRS Roomの開発環境を構築し、動作確認をする方法を説明します。

C++プロジェクトへの組み込み

C++プロジェクトでMRS Roomを使うには、ヘッダファイルをインクルードし、ライブラリファイルをリンクします。

組み込みに必要なファイルは以下の位置にあります。

パス 概要
mrs_room/include C++用のMRS Roomライブラリのヘッダファイルをまとめたもの
mrs/library/mrs_room C++用のMRS Roomライブラリをプラットフォーム単位でまとめたもの

ヘッダファイルパスの設定

MRS Roomは、 MRS Roomのためのヘッダと、下位のMRSライブラリのヘッダの2種類を必要とします。
そのため、次の2つのディレクトリをコンパイラに与えてください。

mrs_room/include
mrs/include

クライアントでは、以下のコードがコンパイルできれば問題ありません。

#include <mrs_room/client.hpp>

サーバーでは、以下のコードがコンパイルできれば問題ありません。

#include <mrs_room/server.hpp>

Windowsでのリンク(サーバー/クライアント共通)

MRS RoomはMRSを用いて実装されています。
MRSのリンクについては、 MRSのディレクトリ (mrs/library/mrs/)以下に配置されているものを使います。
詳しい設定方法については、MRSのドキュメントを参照してください。

クライアントでは、以下のファイルをリンカに入力してください。

mrs/library/mrs_room/windows/enet_uv_openssl_1.1.1/{MSVSバージョン}/{MSVSランタイム}/$(Platform)/$(Configuration)/
  mrs_room_client.lib

サーバでは、以下のファイルをリンカに入力してください。

mrs/library/mrs_room/windows/enet_uv_openssl_1.1.1/{MSVSバージョン}/{MSVSランタイム}/$(Platform)/$(Configuration)/
  mrs_room_server.lib

MacOS X でのリンク

クライアントでは、以下のファイルをリンカに入力してください。

mrs/library/mrs_room/mac/{MacOSXバージョン}/enet_uv_openssl_1.1.1/
  libmrs_room_client.a

サーバでは、以下のファイルをリンカに入力してください。

mrs/library/mrs_room/mac/{MacOSXバージョン}/enet_uv_openssl_1.1.1/
  libmrs_room_server.a

Linuxでのリンク

クライアントでは、以下のファイルをリンカに入力してください。

mrs/library/mrs_room/linux/{OS_GCCバージョン}/enet_uv_openssl_1.1.1/
  libmrs_room_client.a

サーバでは、以下のファイルをリンカに入力してください。

mrs/library/mrs_room/linux/{OS_GCCバージョン}/enet_uv_openssl_1.1.1/
  libmrs_room_server.a

サンプルの動作確認

mrs_room/sample/cpp/ ディレクトリ以下に、サンプルコードのソースコードが配置されています。
ROOM_API_Overview.htmlでは、
それらの動作確認の方法を詳しく解説しています。

ここでは、サンプルコードをビルドする方法を説明します。

MacOS X | Linux | Windowsでサンプルコードをビルドする

MacOS Xでのビルド

cd mrs_room/sample/cpp/build
MRS_PLATFORM_TYPE=mac MRS_PLATFORM_VERSION=10.12 ./cmake.sh
make clean all

上記を実行すると、mrs_room/sample/cpp/build以下に、room_serverなど実行ファイルが生成されます。

Linuxでのビルド

cd mrs_room/sample/cpp/build
MRS_PLATFORM_TYPE=linux MRS_PLATFORM_VERSION=centos7_4.8.5 ./cmake.sh
make clean all

上記を実行すると、mrs_room/sample/cpp/build以下に、room_serverなど実行ファイルが生成されます。

Windowsでのビルド

cd mrs_room/sample/cpp/build
MRS_PLATFORM_TYPE=windows MRS_PLATFORM_VERSION=2017 ./cmake.sh

上記を実行すると、mrs_room/sample/cpp/build/windows以下に、2017_MT_x64_Release/mrs_room_sample.slnなどのファイルが生成されます。

C#プロジェクトへの組み込み

C#プロジェクトにMRS Roomを使うには、まずC#フレームワークを選択します。

フレームワーク 概要
.NET Core 2.0以降 マルチプラットフォームのC#フレームワーク。推奨フレームワークです。サンプルプログラムではこちらを使用しています。
.NET Framework Windows専用のフレームワークです。Windowsでのみ使用するならこちらを選択します。

ここでは推奨フレームワークである.NET Core 2.1を用いて説明していきます。

.NET Coreのインストール

以下のサイトから各プラットフォームに.NET Core SDKをダウンロードして、インストールしてください。

https://github.com/dotnet/core/blob/master/release-notes/2.1/2.1.12/2.1.12-download.md

CentOS上でのインストール方法については、以下のシェルを実行してください。

mrs\sample\csharp\netcoreapp2.1\script\inst.h

$ sh inst.sh

最新版の.NET Coreを使用する場合などは、以下を参考にしてください。

上記のシェル内に記述されている.NET Coreのバージョンを変更すればインストールが可能です。

https://github.com/dotnet/core/blob/master/release-notes/2.2/2.2.6/2.2.6-download.md

.NET Coreでのプロジェクト作成

.NET Core 2.0以降においては、VisualStudio 2017以降を使用してプロジェクトを作成します。

「ファイル」→「新規作成」→「プロジェクト」でプロジェクト作成ダイアログを開き、

「Visual C#」→「.NET Core」→「コンソール アプリ(.NET Core)」を選択してプロジェクト作成を作成します。

空プロジェクトを作成すると、プロジェクトファイル内は以下のような内容で作成されます。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

</Project>

プロジェクト作成上のワンポイント

プロジェクトのビルドイベントで、ファイルコピーなどを行う事があります。(mrs.dllなど)

Linux上でシェルを実行した際に、コピーのエラーの元となりますので、LinuxとWindowsではプロジェクトを分けておくと便利です。

.NET Coreでのビルド&実行

.NET Coreを使用してのビルド&実行の手順です。

尚コマンドは、Windowsのバッチ処理や、Linux上のシェルからも同じ構文となります。

.NET Coreを使用してのビルドコマンドは以下の通りになります。

dotnet restore {プロジェクト名}.csproj
dotnet publish {プロジェクト名}.csproj --configuration {Debug|Release}

dotnetコマンドではpublishを指定してビルドしています。これはpublishを指定すると、特定フォルダに実行に必要なファイル一式がコピーされ、ビルド後にフォルダを移動しても実行できるからです。

.NET Coreを使用しての実行コマンドは以下の通りになります。

出力フォルダがデフォルトでDebugビルドの場合
dotnet bin/Debug/netcoreapp2.1/publish/{プロジェクト名}.dll

プロジェクトを選択しても実行できます
dotnet run {プロジェクト名}.csproj --configuration {Debug|Release}

C#用MRS Roomクラスライブラリをプロジェクトに組み込む

ここまでで.NET Core2.1のプロジェクトを作成しましたので、次はMRS Roomクラスライブラリを組み込んでいきます。

パス 概要
mrs_room\sample\csharp\libmrs\Monobit\mrs MRS用のクラスライブラリが入っています。
mrs_room\sample\csharp\libmrs\Monobit\mrs_room MRS Room用のクラスライブラリが入っています。
mrs_room\sample\csharp\libmrs\Monobit\libs 便利クラスライブラリが入っています。
mrs_room\sample\csharp\2017\netcoreapp2.1 各フォルダにはC#用のRoomサーバーやRoomクライアントのサンプルアプリのプロジェクトファイルやビルド&実行スクリプトが入っています。
mrs_room\sample\csharp\source C#用のサンプルアプリのソースコードが入っています。

MRSとMRS Roomクラスライブラリを参照するために、プロジェクトに参照パスを追加します。

MRSクラスライブラリでは高速化のためにunsafeコードを使っていますので、

PropertyGroupの中でunsafeコードの許可も同時にプロジェクトに追加しておきます。

最後にビルド後のイベントとして、PostBuildEventにてmrs.dllをパッケージよりコピーしてきます。

mrs.dllはVisualStudio 2015でビルドされたもので問題ありません。

但し、このコピーコマンドを入れるとLinux上では当然のようにエラーが表示されます。

そのためPostBuildEventを省いたLinux版のプロジェクトファイルを作っておくと便利です。

下記の例では、サンプルアプリのフォルダ位置と同列の場所にプロジェクトを作成している例となります。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <Platforms>AnyCPU;x64</Platforms>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <Prefer32Bit>false</Prefer32Bit>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <Prefer32Bit>false</Prefer32Bit>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

  <ItemGroup>
    <None Remove=".gitignore" />
  </ItemGroup>

  <ItemGroup>
    <Compile Include="..\..\source\room_server.cs" />
    <Compile Include="..\..\libmrs\Monobit\mrs\Mrs.cs" />
    <Compile Include="..\..\libmrs\Monobit\mrs\MrsBuffer.cs" />
    <Compile Include="..\..\libmrs\Monobit\mrs\MrsDateTime.cs" />
    <Compile Include="..\..\libmrs\Monobit\mrs\MrsTime.cs" />
    <Compile Include="..\..\libmrs\Monobit\mrs\MrsUtility.cs" />
    <Compile Include="..\..\libmrs\Monobit\mrs_room\MrsRoom.cs" />
    <Compile Include="..\..\libmrs\Monobit\mrs_room\MrsRoomClient.cs" />
    <Compile Include="..\..\libmrs\Monobit\mrs_room\MrsRoomServer.cs" />
    <Compile Include="..\..\libmrs\Monobit\libs\base_libs.cs" />
    <Compile Include="..\..\libmrs\Monobit\libs\room_libs.cs" />
  </ItemGroup>

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="copy ..\..\..\..\..\..\..\projects\mrs\library\mrs_room\windows\enet_uv_openssl_1.1.1\2017\MT\$(PlatformName)\$(configuration)\mrs.dll $(TargetDir)" />
  </Target>

</Project>

C#版サンプルコードの動作確認

C++版同様にサンプルコードをコピーして開発を始めることが可能です。

サンプルコードは以下の位置にあります。

パス 概要
mrs_room\sample\csharp\source\room_server.cs C#用のROOMサーバーの基本のサンプル
mrs_room\sample\csharp\source\room_client_owner.cs C#用のROOMクライアントの部屋作成サンプル
mrs_room\sample\csharp\source\room_client_leave.cs C#用のROOMクライアントの退室サンプル
mrs_room\sample\csharp\source\room_client.cs C#用のROOMクライアントの入室サンプル
mrs_room\sample\csharp\source\get_rooms.cs C#用のROOM情報の取得サンプル

C#版サンプルコードの使い方

基本的にC++版サンプルコードの使い方に準じます。

但し、実行コマンドが異なるので注意が必要です。

上記に実行コマンドを説明していますので、参照してください。

実行コマンド以外では、引数の指定方法が違います。
例としてroom_serverの引数の指定方法を説明します。

dotnet bin/x64/Debug/netcoreapp2.1/publish/room_server.dll --sleep_msec=1 --server_addr="0.0.0.0" --server_port=22222 --backlog=10

C#版の注意点

.NET Coreでは、C++と違いOSからのシグナル処理の対応がプラットフォーム間においてまちまちです。

その為、MRSにおいてはプラットフォーム間のシグナル処理を吸収した便利クラスがありますので、

実装のお役に立ててください。

・ExitSignalの使い方
using()内で使用します。
以下のようにSetSignal()で設定したハンドラ内でループフラグをOFFにして、
正常にループを終了させる事ができます。

using System.Threading;
using MrsLibs.Signal

class Hoge
{
    private static volatile bool s_bIsRun = true;

    publib static void Main(string[] args)
    {
        using(var sig = new ExitSignal())
        {
            sig.SetSignal((obj, e) => {
                var ev_arg = e as SignalEventArgs;
                Console.WriteLine($"Event: {event_args.SignalEnums}");
                s_bIsRun = false;
                Thread.Sleep(10);
            });

            while(s_bIsRun)
            {
                // ループ処理
                ...
            }
        }
    }
}


ちなみに名前空間のMrsLibsは、
mrs_room\sample\csharp\libmrs\Monobit\libs\base_libs.cs
に定義されています。

Copyright © 2019 MONOBIT ENGINE Inc.