为什么在运行新项目时它不显示任何窗口并且断点永远不会起作用,它永远不会到达 form1 构造函数?



我在第一个项目上遇到了这个问题dopplereffect类。

我现在进行了测试。这是我原始的Form1代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DopplerRadar
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            DopplerEffect de = new DopplerEffect();
            de.pb1 = pictureBox1;
            de.bmpWithPoints = new Bitmap(@"c:tempanim3.gif");
            de.numberOfPoints = 100;
            de.randomPointsColors = false;
            de.Init();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
    }
}

当我在线上放一个断点时:

DopplerEffect de = new DopplerEffect();

它永远不会停止。

但是,如果我从form1中移动所有代码,而只是为测试一行添加:

string tt = "tt";

然后在此行上放一个断点,它将停在线上。

所以我想问题是在类dopplereffect的某个地方。

但是,如果我在dopplereffect代码上也放了一个断点,它也不会停止。

所以问题出在dopplereffect上,但我无法弄清楚为什么和何处。

这是dopplereffect代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;
using System.Diagnostics;

namespace DopplerRadar
{
    public class DopplerEffect
    {
        [DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
        public static extern IntPtr MemSet(IntPtr dest, int c, int count);
        private System.Windows.Forms.Timer timer1;
        private Stream mymem;
        private Bitmap ConvertedBmp;
        private Device D3Ddev = null;
        private PresentParameters D3Dpp = null;
        private DisplayMode DispMode;
        private Sprite D3Dsprite = null;
        private Texture backTexture = null;
        private Texture scannedCloudsTexture = null;
        private byte[] argbValuesOfTransparentTexture;
        private float distanceFromCenterPixels;
        private float distanceFromCenterKm = 200F;
        private List<Point> detectedPoints;
        private float[] angleArray, distanceArray;
        private double angleCalculation, distance;
        private int bytes = 2048 * 512;
        private List<Point> points = new List<Point>();
        private Random r = new Random();
        private Bitmap bmpnew;
        private Bitmap bmpWithoutPoints;
        public int numberOfPoints = 100;
        public Color pointsColor = Color.Red;
        public bool randomPointsColors = false;
        public Bitmap bmpWithPoints;

        public System.Windows.Forms.PictureBox pb1;
        public void Init()
        {
            bmpWithoutPoints = new Bitmap(bmpWithPoints.Width, bmpWithPoints.Height);
            bmpnew = new Bitmap(bmpWithPoints.Width, bmpWithPoints.Height);
            if (bmpWithPoints == null)
            {
                for (int x = 0; x < bmpWithPoints.Width; x++)
                {
                    for (int y = 0; y < bmpWithPoints.Height; y++)
                    {
                        bmpWithPoints.SetPixel(x, y, Color.Black);
                    }
                }
                Color c = Color.Red;
                for (int x = 0; x < numberOfPoints; x++)
                {
                    for (int y = 0; y < numberOfPoints; y++)
                    {
                        if (randomPointsColors == true)
                        {
                            c = Color.FromArgb(
                                r.Next(0, 256),
                                r.Next(0, 256),
                                r.Next(0, 256));
                        }
                        else
                        {
                            c = pointsColor;
                        }
                        using (var g = Graphics.FromImage(bmpWithPoints))
                        {
                            //g.FillCircle(Brushes.Red, clouds1[x], 5);
                        }
                        bmpWithPoints.SetPixel(r.Next(0, bmpWithPoints.Width), r.Next(0, bmpWithPoints.Height), c);
                    }
                }
            }
            else
            {
                randomPointsColors = false;
            }
            timer1 = new System.Windows.Forms.Timer();
            timer1.Interval = 10;
            timer1.Enabled = false;
            timer1.Tick += Timer1_Tick;
            ConvertedBmp = ConvertTo24(bmpWithPoints);//@"c:tempanim3.gif");
            mymem = ToStream(ConvertedBmp, ImageFormat.Bmp);
            //blackImage = ConvertTo24(blackImage);
            //mymem = ToStream(ConvertedBmp, ImageFormat.Bmp);
            distanceFromCenterPixels = (float)(/*183d*/ ((double)200 / 1.09289617486) * (double)distanceFromCenterKm / 200d);
            argbValuesOfTransparentTexture = new byte[bytes];
            InitializeDirectX(pb1);
            FindPoints();
            //initialize angleArray
            angleArray = new float[detectedPoints.Count];
            distanceArray = new float[detectedPoints.Count];
            for (int i = 0; i < detectedPoints.Count; i++)
            {
                CalculateAngleAndDistance(detectedPoints[i].X, detectedPoints[i].Y, out angleCalculation, out distance);
                angleArray[i] = (float)angleCalculation;
                distanceArray[i] = (float)distance;
            }
            timer1.Enabled = true;
        }
        public void GetPictureBox(System.Windows.Forms.PictureBox pb1)
        {
        }
        private void FillCircle(Graphics g, Brush brush,
                              PointF center, float radius)
        {
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.FillEllipse(brush, center.X - radius, center.Y - radius,
                                 radius + radius, radius + radius);
        }
        static float angleF_ = 0.0F;
        private void Timer1_Tick(object sender, EventArgs e)
        {
            if (angleF_ > 360F)
            {
                angleF_ -= 360F;
            }
            ReturnTexture(scannedCloudsTexture, detectedPoints, angleArray, angleF_, bmpnew);
            DisplayOnScreen(angleF_);
            // To change direction to change += to -=
            // To change speed to raise the value 1.0d 
            angleF_ += 1.0F;
        }
        private Bitmap ConvertTo24(string inputFileName)
        {
            Stopwatch sw = new Stopwatch();
            sw = Stopwatch.StartNew();
            Bitmap bmpIn = (Bitmap)Bitmap.FromFile(inputFileName);
            Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
            using (Graphics g = Graphics.FromImage(converted))
            {
                // Prevent DPI conversion
                g.PageUnit = GraphicsUnit.Pixel;
                // Draw the image
                g.DrawImageUnscaled(bmpIn, 0, 0);
            }
            //converted.Save(outputFileName, ImageFormat.Bmp);
            sw.Stop();
            return converted;
        }
        private Bitmap ConvertTo24(Bitmap inputFileName)
        {
            Stopwatch sw = new Stopwatch();
            sw = Stopwatch.StartNew();
            Bitmap bmpIn = inputFileName;
            Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
            using (Graphics g = Graphics.FromImage(converted))
            {
                // Prevent DPI conversion
                g.PageUnit = GraphicsUnit.Pixel;
                // Draw the image
                g.DrawImageUnscaled(bmpIn, 0, 0);
            }
            //converted.Save(outputFileName, ImageFormat.Bmp);
            sw.Stop();
            return converted;
        }
        public static Stream ToStream(Image image, ImageFormat formaw)
        {
            var stream = new MemoryStream();
            image.Save(stream, formaw);
            stream.Position = 0;
            return stream;
        }
        public Boolean InitializeDirectX(System.Windows.Forms.PictureBox pb1)
        {
            DispMode = Manager.Adapters[Manager.Adapters.Default.Adapter].CurrentDisplayMode;
            D3Dpp = new PresentParameters();
            D3Dpp.BackBufferFormat = DispMode.Format;
            D3Dpp.PresentFlag = PresentFlag.LockableBackBuffer;
            D3Dpp.SwapEffect = SwapEffect.Discard;
            D3Dpp.PresentationInterval = PresentInterval.One; //wait for vertical sync. Synchronizes the painting with
                                                              //monitor refresh rate for smoooth animation
            D3Dpp.Windowed = true; //the application has borders
            try
            {
                D3Ddev = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, pb1.Handle,
                                                                           CreateFlags.SoftwareVertexProcessing, D3Dpp);
                //D3Ddev.VertexFormat = CustomVertex.PositionColored.Format;
                D3Ddev.RenderState.Lighting = false;
                D3Ddev.RenderState.CullMode = Cull.CounterClockwise;
                //load imagesBmp to panelTexture
                //panelTexture = Texture.FromBitmap(D3Ddev, imagesBmp, Usage.Dynamic, Pool.Default)
                backTexture = TextureLoader.FromStream(D3Ddev, mymem);


                //scannerTexture = TextureLoader.FromFile(D3Ddev, @"D:ButtonsRadarradar.png");
                scannedCloudsTexture = new Texture(D3Ddev, 512, 512, 1, Usage.Dynamic, Format.A8R8G8B8, Pool.Default);
                //sprite is used to draw the texture
                D3Dsprite = new Sprite(D3Ddev);
                return true;
            }
            catch
            {
                return false;
            }
        }
        Bitmap bmpn;
        float angle = 0;
        private void DisplayOnScreen(float angleF)
        {
            if (angle < 360)
            {
                bmpn = new Bitmap(512, 512);
                angle++;
            }
            else
            {
                angle = 361;
            }
            Surface backbuffer;
            Brush myBrush = new SolidBrush(Color.FromArgb(110, 0, 255, 0)); //semi transparent color to draw the rotating cone 
            Graphics g;
            //clear the backbuffer with Color.FromArgb(56, 56, 56). This is the double buffer mechanism. Drawing to offscreen 
            //backbuffer and in the end flipping it to main one which is our panelContainer 
            D3Ddev.Clear(ClearFlags.Target, Color.FromArgb(56, 56, 56), 1, 0);
            D3Ddev.BeginScene();
            //Draw Sprites 
            ////////////////////////////////////////////////////// 
            D3Dsprite.Begin(SpriteFlags.AlphaBlend);
            // bitmap with clouds 
            //D3Dsprite.Draw2D(backTexture, new PointF(0, 0), 0F, new PointF(0F, 0F), Color.White);
            //the part of clouds that are inside the cone 
            D3Dsprite.Draw2D(scannedCloudsTexture, new PointF(0F, 0F), 0F, new PointF(0F, 0F), Color.White);
            //rotate cone 
            //D3Dsprite.Draw2D(scannerTexture, new PointF(104.5F, 0F), angle, new PointF(256F, 255F), Color.White); 
            D3Dsprite.Flush();
            D3Dsprite.End();
            ////////////////////////////////////////////////////// 

            //Draw the cone. 
            using (backbuffer = D3Ddev.GetBackBuffer(0, 0, BackBufferType.Mono))
            {
                using (g = backbuffer.GetGraphics())
                {
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    g.FillPie(myBrush, 256F - distanceFromCenterPixels, 255F - distanceFromCenterPixels,
                    distanceFromCenterPixels * 2F, distanceFromCenterPixels * 2F, angleF - 23F, 46F);
                    if (angle <= 360)
                    {
                    }
                }
            }
            D3Ddev.EndScene();
            D3Ddev.Present(); //performs the flipping 
        }
        private void CalculateAngleAndDistance(int x, int y, out double angle, out double distance)
        {
            Double dbl = -1.0d;
            Point center = new Point(256, 255);
            distance = Math.Sqrt((double)((center.Y - y) * (center.Y - y) + (center.X - x) * (center.X - x)));
            if (y == center.Y && x > center.X)
            {
                dbl = 0d;
                angle = dbl;
                return;
            }
            else if (x == center.X && y > center.Y)
            {
                dbl = 90d;
                angle = dbl;
                return;
            }
            else if (y == center.Y && x < center.X)
            {
                dbl = 180d;
                angle = dbl;
                return;
            }
            else if (x == center.X && y < center.Y)
            {
                dbl = 279d;
                angle = dbl;
                return;
            }
            else if (x == center.X && y == center.Y)
            {
                angle = dbl;
                return;
            }
            if (x > center.X && y > center.Y) //1
            {
                dbl = Math.Atan(((double)y - (double)center.Y) / ((double)x - (double)center.X));
                dbl = 180d * dbl / Math.PI;
            }
            else if (x < center.X && y > center.Y) //2
            {
                dbl = Math.Atan(((double)y - (double)center.Y) / ((double)center.X - (double)x));
                dbl = 180d * dbl / Math.PI;
                dbl = 180d - dbl;
            }
            else if (x < center.X && y < center.Y) //3
            {
                dbl = Math.Atan(((double)center.Y - (double)y) / ((double)center.X - (double)x));
                dbl = 180d * dbl / Math.PI;
                dbl += 180d;
            }
            else //4
            {
                dbl = Math.Atan(((double)center.Y - (double)y) / ((double)x - (double)center.X));
                dbl = 180d * dbl / Math.PI;
                dbl = 360d - dbl;
            }

            angle = dbl;
        }
        private void ReturnTexture(Texture texture_take, List<Point> lstPnt, float[] anglArr, float angle, Bitmap bmpNew)
        {
            int i, j, stride = 2048;
            float angleBefore, angleAfter;
            GraphicsStream textureStream;
            Boolean bl = false;
            if (bmpNew.Width != 512 && bmpNew.Height != 512)
                throw new Exception("Bitmaps must be of same size.");
            //sets texture to complete transparent 
            unsafe
            {
                fixed (byte* p = argbValuesOfTransparentTexture)
                {
                    MemSet((IntPtr)p, 0x0, argbValuesOfTransparentTexture.Length);
                }
            }

            angleAfter = angle + 23F;
            if (angleAfter >= 360F)
            {
                angleAfter -= 360F;
            }
            angleBefore = angleAfter - 46;
            if (angleBefore < 0F)
            {
                angleBefore += 360F;
                bl = true;
            }
            BitmapData bmD = bmpNew.LockBits(new Rectangle(0, 0, bmpNew.Width, bmpNew.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            unsafe
            {
                byte* p = (byte*)bmD.Scan0.ToPointer();
                //checks all points and draws yellow only those who are inside the cone 
                for (i = 0; i < lstPnt.Count - 1; i++)
                {
                    if (anglArr[i] == -1F)
                    {
                        continue;
                    }
                    if (bl == true)
                    {
                        if (anglArr[i] <= angleAfter || anglArr[i] >= angleBefore) //if point angle is inside cone. Cone angle is 46 degrees 
                        {
                            if (distanceArray[i] <= distanceFromCenterPixels)
                            {
                                j = lstPnt[i].Y * stride + lstPnt[i].X * 4;
                                //yellow 
                                argbValuesOfTransparentTexture[j + 0] = (byte)0;
                                argbValuesOfTransparentTexture[j + 1] = (byte)255;
                                argbValuesOfTransparentTexture[j + 2] = (byte)255;
                                argbValuesOfTransparentTexture[j + 3] = (byte)255;
                                p[j] = (byte)0;
                                p[j + 1] = (byte)0;
                                p[j + 2] = (byte)255;
                                p[j + 3] = (byte)255;
                            }
                        }
                    }
                    else
                    {
                        if (anglArr[i] <= angleAfter && anglArr[i] >= angleBefore) //if point angle is inside cone. Cone angle is 46 degrees 
                        {
                            if (distanceArray[i] <= distanceFromCenterPixels)
                            {
                                j = lstPnt[i].Y * stride + lstPnt[i].X * 4;
                                //yellow 
                                argbValuesOfTransparentTexture[j + 0] = (byte)0;
                                argbValuesOfTransparentTexture[j + 1] = (byte)255;
                                argbValuesOfTransparentTexture[j + 2] = (byte)255;
                                argbValuesOfTransparentTexture[j + 3] = (byte)255;
                                p[j] = (byte)0;
                                p[j + 1] = (byte)0;
                                p[j + 2] = (byte)255;
                                p[j + 3] = (byte)255;
                            }
                        }
                    }
                }
            }
            //if (angle <= 360)
            //  pictureBox1.Image.Save(@"c:coneimages" + angle + ".gif");
            bmpNew.UnlockBits(bmD);

            {
                using (textureStream = texture_take.LockRectangle(0, LockFlags.None))
                {
                    textureStream.Write(argbValuesOfTransparentTexture);
                    texture_take.UnlockRectangle(0);
                }
                //if (angle <= 360)
                //  pictureBox1.Image.Save(@"c:coneimages" + angle + ".gif");
            }
        }
        private void FindPoints()
        {

            //Bitmap bmptest;
            GraphicsPath gp = new GraphicsPath();
            int x, y, p, j, wdthHght;
            int bytes;
            //byte error_ = 5;
            byte[] rgbValuesWithClouds;
            byte[] rgbValuesWithoutClouds;
            IntPtr ptr;
            Rectangle rect;
            BitmapData bitmap_Data;
            gp.AddEllipse(new RectangleF(73, 72, 367, 367));
            //gp.CloseFigure();
            //using the using statement, bmpWithClouds bitmap is automatically disposed at the end of statement. No memory leaks :)
            using (bmpWithPoints = new Bitmap(mymem))//@"D:MyWeatherStation-Images-And-Iconsradartobmp.bmp")) //24 bit bitmap
            {
                rect = new Rectangle(0, 0, bmpWithPoints.Width, bmpWithPoints.Height);
                wdthHght = bmpWithPoints.Width;
                //Lock bitmap to copy its color information fast
                bitmap_Data = bmpWithPoints.LockBits(rect, ImageLockMode.ReadWrite, bmpWithPoints.PixelFormat);
                ptr = bitmap_Data.Scan0;
                bytes = bitmap_Data.Stride * bmpWithPoints.Height;
                rgbValuesWithClouds = new byte[bytes];
                //copy color information to rgbValues array
                System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValuesWithClouds, 0, bytes);
                //we are done copying so unlock bitmap. We dont need it anymore
                bmpWithPoints.UnlockBits(bitmap_Data);
            }

            //using the using statement, bmpWithClouds bitmap is automatically disposed at the end of statement. No memory leaks :)
            using (bmpWithoutPoints = new Bitmap(this.bmpWithoutPoints))
            //@"D:C-SharpDownload FileDownloading-File-Project-Version-012Downloading Filebinx86ReleaseWithoutClouds.bmp"))//su + "\WithoutClouds.bmp")) //24 bit bitmap
            {
                rect = new Rectangle(0, 0, bmpWithoutPoints.Width, bmpWithoutPoints.Height);
                //Lock bitmap to copy its color information fast
                bitmap_Data = bmpWithoutPoints.LockBits(rect, ImageLockMode.ReadWrite, bmpWithoutPoints.PixelFormat);
                ptr = bitmap_Data.Scan0;
                bytes = bitmap_Data.Stride * bmpWithoutPoints.Height;
                rgbValuesWithoutClouds = new byte[bytes];
                //copy color information to rgbValues array
                System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValuesWithoutClouds, 0, bytes);
                //we are done copying so unlock bitmap. We dont need it anymore
                bmpWithoutPoints.UnlockBits(bitmap_Data);
            }
            // Each position in these arrays, rgbValuesWithoutClouds and rgbValuesWithClouds, corresponds a color. eg
            // First pixel   Second pixel   Third pixel   Forth pixel .... // bitmaps
            //    B G R          B G R         B G R         B G R    .... // rgbValues arrays
            //bmptest = new Bitmap(512, 512);
            detectedPoints = new List<Point>();
            for (y = 0; y < wdthHght; y++)
            {
                j = 0;
                for (x = 0; x < wdthHght; x++)
                {
                    p = y * wdthHght * 3 + j;
                    if (rgbValuesWithClouds[p] != rgbValuesWithoutClouds[p])
                    {
                        detectedPoints.Add(new Point(x, y));
                        //bmptest.SetPixel(x, y, Color.Red);
                    }
                    j += 3;
                }
            }
        }
    }
}

如果我在dopplereffect类的第一行上放了一个断点,它也不会在此行上停止。

,但我在Form1构造函数中再次进行了测试,表明DoppleReffect类有问题。

解决方案非常简单,但是Visual Studio使其并不总是那么容易找到。

如果您在项目属性中选中"启用本机代码调试",请调试页面并运行程序,则将获得一个例外"混合模式组件是根据版本的v1.1.4322'构建的,无法加载没有其他配置信息的4.0运行时。"

简短的研究导致托管DirectX从.NET Framework 4.0。

将您的app.cofig更改为

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>

它将运行。

最新更新