C#中的不安全错误

时间:2014-02-20 21:04:38

标签: c# unsafe

您好我尝试在我的项目中使用一些代码,错误上升到语法,我不知道它是什么。 错误来自以“不安全”开头的标签。

什么是不安全的,在哪里以及为什么要使用它? tnx朋友......

代码在这里:

public Bitmap Cursor(ref int cursorX, ref int cursorY)
        {
            int screenWidth = 1;
            int screenHeight = 1;
            lock (_newBitmap)
            {
                try
                {
                    screenWidth = _newBitmap.Width;
                    screenHeight = _newBitmap.Height;
                }
                catch (Exception)
                {
                    ...
                }
            }
            if (screenWidth == 1 && screenHeight == 1)
            {
                return null;
            }
            Bitmap img = CaptureScreen.CaptureCursor(ref cursorX, ref cursorY);
            if (img != null && cursorX < screenWidth && cursorY < screenHeight)
            {
                int width = img.Width;
                int height = img.Height;

                BitmapData imgData = img.LockBits(
                    new Rectangle(0, 0, width, height),
                    ImageLockMode.ReadOnly, img.PixelFormat);

                const int numBytesPerPixel = 4;

                int stride = imgData.Stride;
                IntPtr scan0 = imgData.Scan0;
                unsafe      // ERROR IN THIS LINE
   //  IF i move unsafe to method header (unsafe public .... ) i get some another errors 
                    {
                        byte* pByte = (byte*)(void*)scan0;
                        for (int h = 0; h < height; h++)
                        {
                            for (int w = 0; w < width; w++)
                            {
                                int offset = h * stride + w * numBytesPerPixel + 3;
                                if (*(pByte + offset) == 0)
                                {
                                    *(pByte + offset) = 60;
                                }
                            }
                        }
                    } 
                    img.UnlockBits(imgData);

                    return img;
                }
                return null;
            }

3 个答案:

答案 0 :(得分:2)

http://msdn.microsoft.com/en-us/library/chfa2zb8.aspx

unsafe关键字允许C#代码操作指针。请注意,您必须设置项目设置以允许编译器编译不安全的代码;我认为这是/unsafe选项。

您的代码通过直接访问内存中的位图来操作位图位。根据我的经验,这是{#1}}在C#中最常见的用途之一。涉及Bitmap.SetPixel的替代方案要慢得多。

答案 1 :(得分:1)

unsafe允许您使用指针进行原始内存操作。要编译不安全的代码,您需要告诉您的项目允许不安全的代码。右键单击项目并单击构建,然后找到允许不安全代码复选框。 Look for the checkbox

答案 2 :(得分:1)

我不知道您为什么要使用不安全的代码,但是为了使用此代码,您必须首先在项目构建配置中选中“允许不安全”。