基本
- 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]% |