.Net framework を C++ から扱うために、自分は C++/CLI を書いたりすることもあるのですが、今回 C++/CX にも少し手を出し始めたのでそのときの記録メモです。
慣れている人から見ればしょうも無いことを記録しているのかもしれませんが、あたたかく見守ってくれればと思います。
C++/CXとは
今流行の(?) UWP アプリを C++ で記述するときに使用する言語です。
CLI では .Net framework を扱ってきたように、 CX では WinRT を扱います。
各種方法まとめ
C++/CX ではどう記述するのかを場合に分けて記録しておきます。 C++/CLI ではおなじみの点については記載なしです。
オブジェクトの生成
gcnew から ref new に変わりました。
削除には delete を呼び出してもよいみたいです。
as 演算子
C# での as 演算子に相当するものとして dynamic_cast が使えるようです。
文字列について
String^ s = "hogehoge"; String^ s = ref new String("hogehoge");
このように記述することが可能。 こう書くのであれば、Lプレフィックスもつけなくてよいみたいです。
Cの char 配列も String コンストラクタに渡せます。
std::string, std::stringstream を使っている場合にはちょっと面倒が増えました。一度UTF8経由して wchar_t 文字列へと変換が必要でした。
変換が終わった後は String( oss.str().c_str() ) などで C++/CX の String に出来ました。
SHA1 ハッシュを計算
std::string の文字列から Cryptography API を使って、 SHA1 ハッシュを計算するには以下のようにします。
配列データのプロキシを作って、 CryptographicBuffer に入れて計算オブジェクトに渡します。
std::string str = "the lazy dog"; auto binaryArray = new Platform::ArrayReference((uint8_t*)str.data(), str.length()); auto provider = HashAlgorithmProvider::OpenAlgorithm(HashAlgorithmNames::Sha1); IBuffer^ buffer = CryptographicBuffer::CreateFromByteArray(reinterpret_cast ^>(binaryArray)); auto hashData = provider->HashData(buffer); Array ^ result; CryptographicBuffer::CopyToByteArray(hashData, &result);
素直に配列を渡せないという点で、一手間増えてますね。
Task.Run
C#で非同期処理をやるのに便利だった Task です。
create_task 関数を使って同じようにできるようです。
create_task( []() { /*ここに処理*/} );
タスクの実行スレッドを制御するには、この関数の第2引数で設定します。これにより現在のスレッドで実行したり他のバックグランドスレッドにやらせたりとできます。
create_task( []() { /*ここに処理*/}, task_continuation_context::use_current() );
UIスレッドで実行させたい場合には、 CoreDispatcher.RunAsync メソッドという方法もあるようです。
処理させたい内容をそのままラムダで渡せず、 DispatchedHandler でくるんで上げる必要があるようです。
Dispatcher->RunAsync( CoreDispatcherPriority::Normal, ref new DispatchedHandler( [this]() { this->txtLog->Text += ref new String(L"Hello");} ) );
まとめ
流行ってないからなのか日本語で C++/CX の情報ってまだまだ少ないですね。
C++/CX を触ってみて、C++/CLI のものとはまたちょっと違った風のコードになるという感触でした。
1つ気になったのは、コンパイル速度がやや遅めであるという点です。ヘタしたら C++ のコードよりもコンパイル遅いかも。