C#の知識を流用する概要この説では、C#や.NETの知識はあるものの、C++やC++/CLIの知識はほとんど無い、という人が ScenarioModは、C++/CLIScenarioModはC++/CLIで構成されています。 この意味すところは、「.NET FrameWork」のほとんど全ての資産を簡単に利用できる。 今やWindows上の資産や便利な機能は、 .NET FrameWork、「特にC#」を中心に展開されています。 「プロユースのC/C++はわかりません、でもC#なら簡単なGUIアプリなら作れます。」 また、マイクロソフト自身がそのように誘導していますし、 では、C#の知識を持つ人が、 ここでは、この点にフォーカスを当ててみます。 便利なツール「C# to C++ Converter」そこで管理人がお勧めするのが、「C# to C++ Converter」です。 このページ に 「Install C# to C++ Converter」というものがあります。 実はこれが非常に役に立ちます。 このツールは、C#のソースをC++/CLI へと非常に高い精度で変換できます。
完全なエラーのないソースであればあるほど、あるいは、 下図のように左側に、C#のソースを記述します。 C# to C++ Converter の必須設定
using System; using System.Collections.Generic; class Test { void MyProc() { List<int> mylist = new List<int>(); mylist.Add(32); mylist.Add(25); foreach(var i in mylist) { Console.WriteLine(i); } } } 図のように「C++/CLI」をコンボボックスリストから選択します。
using namespace System; using namespace System::Collections::Generic; private ref class Test { private: void MyProc() { List<int> ^mylist = gcnew List<int>(); mylist->Add(32); mylist->Add(25); for each (auto i in mylist) { Console::WriteLine(i); } } }; これがC++/CLIです。 Linqやdynaimicなど、C#4.0以降に付け加えられた機能を除けば、 又、ライブラリは同じものを参照しているわけですから、原則全て利用可能です。 C#の可変長引数なども問題なく変換出来ます。 using System; using System.Collections.Generic; class Test { int MySumFunc(params int[] values) { int Sum = 0; foreach(int v in values) { Sum += v; } return Sum; } void MyProc() { MySumFunc(1,2,3,4,5,6); } } 同じように、ツールの左側に入力し、「C++/CLI」を選びなおしてみましょう。 using namespace System; using namespace System::Collections::Generic; private ref class Test { private: int MySumFunc(... cli::array<int> ^values) { int Sum = 0; for each (int v in values) { Sum += v; } return Sum; } void MyProc() { MySumFunc(1,2,3,4,5,6); } }; 本当にこんな記述が ScenarioModで使えるのでしょうか? ScenarioModに貼り付けて、 int MySumFunc(... cli::array<int> ^values) { int Sum = 0; for each (int v in values) { Sum += v; } return Sum; } void カスタム::On_プレイヤ担当ターン《メイン画面》() { int sum = MySumFunc(1, 2, 3, 4, 5, 6); デバッグ出力 << sum << endl; } なんということでしょう、なんという恐ろしさ。 そうです、 Stringとstringの問題点しかし、1点問題があります。 それは.NET FrameWorkのString型(C#のstring=System::String)と、 そこでScenarioModでは、この変換を容易にする仕組みが存在しています。 string nstr = "あああ"; String^ mstr = String←string(nstr);// C++のstring型から.NET FrameWorkのSystem::String型へ String^ mmsg = "あいう"; string nmsg = string←String(mmsg); // .NET FrameWorkのSystem::String型から C++のstring型へ この点だけ注意すれば大丈夫です。 存分にC#で得たライブラリの知識を活かして記述できるはずです。 |