如何在 VB.Net 中使用不安全代码?

11

我想知道以下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);
                 }
            }
        }
   }

3
你可以将它放入C#程序集中,并从你的VB.NET项目中引用它。 - bkaid
请参见http://stackoverflow.com/questions/2307433/can-i-use-a-c-dll-with-unsafe-code-in-vb-net/2307448#2307448。 - Brian
3个回答

31

看起来这是不可能的。

这篇文章中可以看出:

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


3

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

3
这不一样。不安全代码允许使用指针,而这个托管代码使用引用。引用比指针慢得多。 - Nick
5
这就好像说冒泡排序和快速排序是相同的,只因为在少量项目时你的眼睛看不出任何区别。 - Nick
5
这并不是一场真正的对话。引用比指针慢得多。问题是如何在vb.net中使用不安全代码,你的回答是使用托管代码。托管代码与不安全代码非常不同,并且比“仅仅”双倍时间更慢。我不知道为什么你拒绝接受这个事实。你可以否认它,但这并不能改变现实。而你的评论表明你根本没有编写需要在负载下表现良好的可扩展软件的经验。 - Nick
3
VB.Net不允许使用不安全的代码,而您回答中的托管VB.Net代码与C#中的不安全代码是不同的。我不知道你为什么还在继续谈论这个。 - Nick
3
可能值得我指出的是 - 你的代码无法编译。你不能像那样在对象上使用 AddressOfAddressOf 只能与方法名称一起使用。 - Nick Shaw
显示剩余5条评论

2

不可能,因为VB.NET不支持不安全代码。


20
不应该通过复制别人的答案来回答自己的问题。最好接受Bala R的答案。 - sfarbota

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接