2011-05-06 15 views
6

Aşağıdaki C# kodu VB.NET eşdeğer öğrenmek istiyorum: bu mümkün değil gibiVB.Net'de güvenli olmayan kodu nasıl kullanabilirim?

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

rağmen “Gerçek bir soru değil” için çok fazla yakın oy var. İlk bakışta topladığım soru şu: “bu C# yi bana. Şimdi, ben vb.net uzman değilim, ama bu gerçek bir soru gibi görünüyor. – Tesserex

+3

C# grubuna yerleştirebilir ve VB.NET projenizden referans alabilirsiniz. – bkaid

+0

@Bala Bu soru bana şöyle bir cevap veriyor: Bu soruya * cevap * mevcut haliyle makul bir şekilde cevaplandırılabilir ve tekrar açılmalıdır. – Justin

cevap

7

değil mümkünse.

+9

Başkasının cevabını kopyalayarak kendi sorunuza cevap vermemelisiniz. Sadece Bala R'ın cevabını kabul et. – sfarbota

16

görünüyor.

this post kaynaktan VB.NET bu açıdan C# daha kısıtlayıcıdır. Herhangi bir koşulunda güvenli olmayan kod kullanımına izin vermez. vb.net güvensiz kod desteklemediği

0

WinAPI'de arama yapmak için pinvoke özelliğini kullanabilirsiniz, sonra güvensiz kodu kullanabilirsiniz.

5

VB.NET kullanımı güvensiz kod izin vermez, ancak kodunuzu yapabilirsiniz güvenli yönetilen:

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

Bu, aynı değil. Güvenli olmayan kod, işaretçilerin kullanımına izin verir, bu yönetilen kod referansları kullanır. Referanslar işaretçilerden önemli ölçüde daha yavaştır. – Nick

+0

, 0,00001sec ve 0.00002sec'i önemsiyor mu? – Minh

+0

İşaretçiler kullanmak, yalnızca referansların kullanılma süresinin yarısı kadar değildir. – Nick

3

Aynı sonuçla bu güvenli kodu kullanabilirsiniz

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

İşaretçi 'System.Reflection.Pointer' sınıfı mı? Bu bulabildiğim tek şey, ama doğru görünmüyor (güvenli olmayan belleği korumak/korumasını kaldırmak için .Box ve .Unbox statik yöntemlerini kullanmak gerekir) ... –

İlgili konular