Как я могу использовать небезопасный код в VB.Net? - PullRequest
9 голосов
/ 06 мая 2011

Я хотел бы знать VB.NET-эквивалент следующего кода C #:

    unsafe
    {
        byte* pStart = (byte*)(void*)writeableBitmap.BackBuffer;
        int nL = writeableBitmap.BackBufferStride;

        for (int r = 0; r < 16; r++)
        {
            for (int g = 0; g < 16; g++)
            {
                for (int b = 0; b < 16; b++)
                {
                    int nX = (g % 4) * 16 + b;                            
                    int nY = r*4 + (int)(g/4);

                    *(pStart + nY*nL + nX*3 + 0) = (byte)(b * 17);
                    *(pStart + nY*nL + nX*3 + 1) = (byte)(g * 17);
                    *(pStart + nY*nL + nX*3 + 2) = (byte)(r * 17);
                 }
            }
        }
   }

Ответы [ 4 ]

21 голосов
/ 10 мая 2011

Похоже, это невозможно.

С этот пост

VB.NET более строг, чем C # в это уважение. Это не позволяет использование небезопасного кода под любым обстоятельства.

5 голосов
/ 28 января 2014

VB.NET не позволяет использовать небезопасный код, но вы можете сделать свой код в безопасном управляемом:

Dim pStart As IntPtr = AddressOf (writeableBitmap.BackBuffer())
Dim nL As Integer = writeableBitmap.BackBufferStride

For r As Integer = 0 To 15
    For g As Integer = 0 To 15
        For b As Integer = 0 To 15
            Dim nX As Integer = (g Mod 4) * 16 + b
            Dim nY As Integer = r * 4 + CInt(g \ 4)

            Marshal.WriteInt32((pStart + nY * nL + nX * 3 + 0),(b * 17))
            Marshal.WriteInt32((pStart + nY * nL + nX * 3 + 1),(g * 17))
            Marshal.WriteInt32((pStart + nY * nL + nX * 3 + 2),(r * 17))
        Next
    Next
Next
5 голосов
/ 21 мая 2011

Невозможно, поскольку vb.net не поддерживает небезопасный код.

3 голосов
/ 03 сентября 2014

Вы можете использовать этот код безопасности с тем же результатом

Dim pStart As Pointer(Of Byte) = CType(CType(writeableBitmap.BackBuffer, Pointer(Of System.Void)), Pointer(Of Byte))
    Dim nL As Integer = writeableBitmap.BackBufferStride

    For r As Integer = 0 To 15
        For g As Integer = 0 To 15
            For b As Integer = 0 To 15
                Dim nX As Integer = (g Mod 4) * 16 + b
                Dim nY As Integer = r * 4 + CInt(g \ 4)

                (pStart + nY * nL + nX * 3 + 0).Target = CByte(b * 17)
                (pStart + nY * nL + nX * 3 + 1).Target = CByte(g * 17)
                (pStart + nY * nL + nX * 3 + 2).Target = CByte(r * 17)
            Next
        Next
    Next
...