【问题标题】:How can I use unsafe code in VB.Net?如何在 VB.Net 中使用不安全代码?
【发布时间】:2011-05-06 19:01:22
【问题描述】:

我想知道以下 C# 代码的 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);
                 }
            }
        }
   }

【问题讨论】:

标签: c# vb.net unsafe


【解决方案1】:

看来不可能。

来自this post

VB.NET 比 C# 在 这方面。它不允许 在任何情况下使用不安全代码 情况。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 这不一样。不安全代码允许使用指针,这个托管代码使用引用。引用比指针慢得多。
    • 这就像说冒泡排序和快速排序一样,只是因为你的眼睛看不到一小部分项目的任何区别。
    • 这不是什么对话。引用比指针慢得多。问题是如何在 vb.net 中使用不安全的代码,而您的答案是使用托管代码。托管代码与不安全代码非常不同,并且比“只是”两倍的时间要慢得多。我不知道你为什么拒绝接受这个事实。你可以否认一切你喜欢的,但这不会改变现实。而且您的 cmets 表明您根本没有编写需要在负载下良好运行的可扩展软件的经验。
    • VB.Net 不允许不安全代码,并且您的答案中托管的 VB.Net 代码与 C# 中的不安全代码不同。时期。我不知道你为什么还在谈论这个。
    • 也可能值得我指出-您的代码无法编译。你不能在这样的对象上使用AddressOfAddressOf 仅适用于方法名称。
    【解决方案3】:

    不可能,因为 vb.net 不支持不安全代码。

    【讨论】:

    • 您不应该通过复制别人的答案来回答自己的问题。只需接受 Bala R 的回答即可。
    【解决方案4】:

    您可以使用此安全代码获得相同的结果

    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
    

    【讨论】:

    • PointerSystem.Reflection.Pointer 类吗?这是我能找到的唯一一个,但它看起来不正确(它需要使用 .Box 和 .Unbox 静态方法来保护/取消保护不安全的内存)...
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    相关资源
    最近更新 更多