2017-07-07 3 views
3

私はC#で次のコードを持っており、VB.NETでそれを変換したいと思います。私はfixedbyte*が何であるか、どのように変換できるのかよくわかりません。 telerikコンバーターはこれに関する助けとなりません。固定とバイト*をc#からvb.netに変換

fixed (byte* ptrShapeBufferPtr = pointerInfo.PtrShapeBuffer) 
{ 
    mDeskDupl.GetFramePointerShape(
      frameInfo.PointerShapeBufferSize, 
      (IntPtr)ptrShapeBufferPtr, 
      out pointerInfo.BufferSize, 
      out pointerInfo.ShapeInfo); 
} 

+1

これはポインタへのポインタです**私が知っている限り** VB.NETはポインタをサポートしていません。 – jonathana

+0

これは安全でないコードであり、VBでは許可されていません。コードがC++メソッドとのインターフェイスを試みているようです。私がこれらの状況で行う傾向があるのは、基本的にC++に安全な.NETインターフェイスを与え、ネイティブメソッドを管理するC++ラッパーを作成することです。 VBやその他の.NET言語から呼び出すことができます。 – Darryl

+1

'GCHandle.Alloc(...、GCHandleType.Pinned)'、 'GCHandle.AddrOfPinnedObject'です。もしあなたが*必要ならば、私は意味します。 –

答えて

4

VB.NETはポインターをサポートしていないので、代わりにIntPtrを使用する必要があります。これを行う最も簡単な方法は、GCHandleを使用してオブジェクトをガーベジ・コレクションされていないものとしてマークすることです。次に、AddrOfPinnedObject methodを使用してポインタをIntPtrとして取得します。

Dim handle As GCHandle 

Try 
    handle = GCHandle.Alloc(pointerInfo.PtrShapeBuffer, GCHandleType.Pinned) 
    Dim ptrShapeBufferPtr As IntPtr = handle.AddrOfPinnedObject() 

    mDeskDupl.GetFramePointerShape(frameInfo.PointerShapeBufferSize, ptrShapeBufferPtr, pointerInfo.BufferSize, pointerInfo.ShapeInfo) 
Finally 
    If handle.IsAllocated = True Then handle.Free() 
End Try 

これは、より迅速で汚れた解決策です。 GCHandleはこのように使用されることは期待されていませんが、動作し、(AFAIK)はまだ使用できます。これらの種類のもののために特別に設計された他の(もっと長い)方法があります。

+0

@alwaysVBNET:元のタイプはバイト配列でした。私は何ができるかを見ていきます。 –

+1

@HansPassant:私の答えを止めてください。 ;) –

+0

@alwaysVBNET:私の電話から書いているので少し時間がかかりましたが、私は答えを更新しました。 –

関連する問題