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

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

    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);
                 }
            }
        }
   }

person Code0987    schedule 06.05.2011    source источник
comment
Вы можете поместить его в сборку C# и ссылаться на него из своего проекта VB.NET.   -  person bkaid    schedule 06.05.2011
comment
См. также stackoverflow.com/questions/2307433/ .   -  person Brian    schedule 10.05.2011


Ответы (4)


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

Из этого сообщения

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

person Bala R    schedule 10.05.2011

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
person Minh    schedule 27.01.2014
comment
Это не то же самое. Небезопасный код позволяет использовать указатели, этот управляемый код использует ссылки. Ссылки значительно медленнее, чем указатели. - person Nick; 14.05.2014
comment
кого волнуют 0,00001 с и 0,00002 с? - person Minh; 15.05.2014
comment
Использование указателей — это не только половина времени использования ссылок. - person Nick; 16.05.2014
comment
Привет, братан, твой глаз ничего не видит, когда запускает код. почему ты все еще беспокоишься? - person Minh; 16.05.2014
comment
Это все равно, что сказать, что пузырьковая сортировка — это то же самое, что и быстрая сортировка, только потому, что ваш глаз не видит никакой разницы с небольшим набором элементов. - person Nick; 16.05.2014
comment
Я не хочу тратить свое время на этот разговор, мой друг. как я уже сказал, 0,00001 и 0,00002 ничего не значат для конечного пользователя. Даже от 1 до 2 секунд все еще приемлемо. - person Minh; 18.05.2014
comment
Это не очень разговор. Ссылки значительно медленнее, чем указатели. Вопрос был в том, как использовать небезопасный код в vb.net, и ваш ответ — использовать управляемый код. Управляемый код сильно отличается от небезопасного кода и НАМНОГО медленнее, чем просто удвоенное время. Я не знаю, почему вы отказываетесь принять этот факт. Вы можете сколько угодно отрицать это, но это не изменит реальность. И ваши комментарии указывают на то, что у вас нет опыта написания масштабируемого программного обеспечения, которое должно хорошо работать под нагрузкой. - person Nick; 19.05.2014
comment
VB.Net не допускает небезопасный код, а управляемый код VB.Net в вашем ответе не совпадает с небезопасным кодом в C#. Период. Я не знаю, почему ты все еще говоришь об этом. - person Nick; 28.05.2014
comment
Также, возможно, стоит мне указать - ваш код не компилируется. Вы не можете использовать AddressOf для такого объекта; AddressOf работает только с именем метода. - person Nick Shaw; 02.10.2014
comment
Измените границы ваших циклов на что-то гораздо большее, и вы заметите разницу. Этот ответ - мусор. - person djv; 10.02.2015

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

person Code0987    schedule 21.05.2011
comment
Вы не должны отвечать на свой вопрос, копируя чужой ответ. Вместо этого просто примите ответ Bala R. - person sfarbota; 13.10.2015

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

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
person Farid    schedule 03.09.2014
comment
Является ли Pointer классом System.Reflection.Pointer? Это единственное, что я могу найти, но оно выглядит неправильно (требуется использование статических методов .Box и .Unbox для защиты/снятия защиты небезопасной памяти)... - person Nick Shaw; 02.10.2014