基本
- C++/CLIは.NETを扱うもっともローレベルな言語(MSIL除く)
- 値型と参照型、ネイティブ C++ 型の3種類の型がある。
- 値型はスタックに積まれる。
- 参照型はマネージヒープに割り当てられる。
- ネイティブ C++ 型は、スタック、あるいはCRT ヒープに割り当てられる。
- IDisposableを実装できない。デストラクタを書くことでコンパイル時にデストラクタがDispose()メソッドに変わる。
- 参照型をdeleteすると、Disposeメソッド(デストラクタ)が呼び出される。
配列
オブジェクトの配列はキーワードarrayを使う。
array<Object^> ^ datas;
バリュー型の配列も同様。
array<Int32> ^ datas;
列挙型
enum class FILE_TYPE { BITMAP, JPEG, GIF, PPM, PGM, PBM, };
Stringからchar*への変換
System::Stringからアンマネージドのchar*に変換するには、次のように行う。
#include <vcclr.h> char * GetUnmanagedString(System::String ^ str) { pin_ptr<const wchar_t> wch = PtrToStringChars(str); size_t convertedChars = 0; size_t sizeInBytes = ((str->Length + 1) * 2); errno_t err = 0; char * ch = (char*)malloc(sizeInBytes); err = wcstombs_s(&convertedChars, ch, sizeInBytes, wch, sizeInBytes); return ch; }
注意。「彼岸花1.jpg」のように日本語を含むものは変換できませんでした。
[追記]
.NET Framework 文字列操作で、改善案を書きました。
「彼岸花」もイケます!
C#との差異
C# | C++/CLI |
Dispose | デストラクタでおk |
配列 | cli::array<>でおk |
using構文 | ハット(^)をつけずに変数宣言 |
null | nullptr |
foreach | for each |
class | ref class または、ref struct |
struct | value class または、value struct |
static class | ref class Hoge abstract sealed |
new | gcnew |
ref | % |
out | [System::Runtime::InteropServices::Out]% |