2011-05-06 18 views
6

Me gustaría saber el equivalente VB.NET del siguiente código C#:¿Cómo puedo usar un código no seguro en 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); 
       } 
      } 
     } 
    } 
+1

Aunque ya hay muchos votos cercanos para "no es una pregunta real", deduje a primera vista que la pregunta es "ayúdenme a traducir este C# en vb.net". Ahora, no soy experto en vb.net, pero parece una pregunta real. – Tesserex

+3

Puede colocarlo en un ensamblaje C# y hacer referencia a él desde su proyecto VB.NET. – bkaid

+0

@Bala Suena como esa es la respuesta para mí, por lo tanto, esta pregunta * puede * ser respondida razonablemente en su forma actual y debe ser reabierta. – Justin

Respuesta

7

No es posible, ya que vb.net no soporta código no seguro.

+9

No debe responder su propia pregunta copiando la respuesta de otra persona. Solo acepta la respuesta de Bala R en su lugar. – sfarbota

16

Parece que no es posible.

De this post

VB.NET es más restrictiva que C# en este respecto. No permite el uso de código inseguro bajo ninguna circunstancia .

0

Puede usar pinvoke para hacer una llamada también a WinAPI, entonces puede usar un código inseguro.

5

VB.NET no permite el uso de código no seguro, pero se puede hacer el código de seguridad gestionada:

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 
+1

Esto no es lo mismo. El código no seguro permite el uso de punteros, este código administrado usa referencias. Las referencias son significativamente más lentas que los punteros. – Nick

+0

que se preocupan por 0.00001sec y 0.00002sec? – Minh

+0

El uso de punteros no es solo la mitad del tiempo de uso de referencias. – Nick

3

Usted puede utilizar el código de seguridad con el mismo resultado

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 
+2

¿Es 'Pointer' la clase' System.Reflection.Pointer'? Es el único que puedo encontrar, pero no se ve bien (requiere el uso de métodos estáticos .Box y .Unbox para proteger/desproteger la memoria insegura) ... –

Cuestiones relacionadas