コードスペランカー

ゲーム開発日誌など

アンセーフコード

C#ではポインタを扱う際には、このコードが危険であることを明示することが必要なようだ。C#単体ではまず使わないが、CやC++で書かれたDLL等を使うときには必要になる処理だ。

unsafe
  {
    int i = 0;
    int* p = &i;
  }

という具合に書いたりする。
特にvoid型のポインタを指定してきた場合などには使うのではないだろうか?

DXライブラリを利用していていくつかこのような部分を見つけることがある。
これを使うためにはプロジェクトのプロパティ-ビルドから「アンセーフコードの許可」を有効にする必要があるが、DXライブラリの.net版にはDxDLL.csというファイルがありここで、各関数の挙動を定義している。
なので、ここでvoid型のポインタを要求している箇所を特定の配列の先頭を指定することでアンセーフ指定しなくても良い常態にすることができる。
具体的には

#if DX_USE_UNSAFE
        [DllImport("DxLib.dll", EntryPoint="dx_SetVertexBufferData")]
        extern unsafe static int  dx_SetVertexBufferData( int  SetIndex, void *  VertexData, int  VertexNum, int  VertexBufHandle);
        public unsafe static int  SetVertexBufferData( int  SetIndex, void *  VertexData, int  VertexNum, int  VertexBufHandle)
        {
            return dx_SetVertexBufferData( SetIndex , VertexData , VertexNum , VertexBufHandle );
        }
#endif
        [DllImport("DxLib.dll", EntryPoint = "dx_SetVertexBufferData")]
        extern static int dx_SetVertexBufferData(int SetIndex, out VERTEX3D Vertex, int VertexNum, int VertexBufHandle);
        public static int SetVertexBufferData(int SetIndex, out VERTEX3D Vertex, int VertexNum, int VertexBufHandle)
        {
            return dx_SetVertexBufferData(SetIndex, out Vertex, VertexNum, VertexBufHandle);
        }

という感じに書けばよい