C++/CLI

Last-modified: 2008-10-31 (金) 15:27:22

基本

  • 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構文ハット(^)をつけずに変数宣言
nullnullptr
foreachfor each
classref class または、ref struct
structvalue class または、value struct
static classref class Hoge abstract sealed
newgcnew
ref%
out[System::Runtime::InteropServices::Out]%