初学.net  在csdn下载频道down了一份代码    写一个通讯录做大作业
今天碰到.net MDA的问题
错误提示如下
       检测到 LoaderLock
                      Message: 正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
在网上找了一些解决方法  都是把.net的MDA给屏蔽掉  
个人觉得这种做法不好   把隐患藏起来了  所以发帖请教下高手  我的代码问题出在哪了 Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);            //运行登录对话框
            Forms.fmLogin login = new Forms.fmLogin();            login.ShowDialog();
            
            //Console.WriteLine(login.DialogResult.ToString());
这个是主程序的代码   创建了一个login Form,然后显示为对话框   对话框退出后  程序直接退出了在对话框中,退出的代码如下,是cancelButton的事件处理函数private void cancelButton_Click(object sender, EventArgs e)
        {
            //设置当前登录对话框的返回值
            this.DialogResult = DialogResult.Cancel;
            //关闭当前对话框
            this.Close();
        }不知道程序的错误出在哪里,恳请高手指导.

解决方案 »

  1.   

    参考
    http://www.cnblogs.com/winzheng/archive/2008/12/05/1348575.html
      

  2.   

    private void cancelButton_Click(object sender, EventArgs e)
            {
               Application.Exit();
            }
      

  3.   

    你想的是对话框退出后,程序直接不退出吗?
    如果点击对话框取消整个程序结束就是上面这样写,我不知道你到底要什么样的,还有就是你的
    this.DialogResult = DialogResult.Cancel;
    这东西不要写在你这个取消息事件里面
    如果要用这个值可以写到你的fmLogin窗体加载事件里面:
    确定按钮.DialogResult = DialogResult.OK;
    取消按钮.DialogResult = DialogResult.Cancel;然后在:
     Forms.fmLogin login = new Forms.fmLogin();、
    login.ShowDialog();
    if(login.DialogResult ==DialogResult.OK)
    {
    //点击确定按钮执行的内容}
      

  4.   

    以前,我们的开发人员和测试人员有时会发现一些类似下图的异常。  这些异常的发生往往都是看起来很随机,很难重现的。调用堆栈往往是空的。并且,当程序脱离IDE运行时,都不会发生这些异常。因此,我们经常认为这些异常是IDE的Bug导致。很少在意。(至少我以前是这样) 今天详细的看了一下MSDN中关于MDA的介绍。发现这些问题往往都是很重要的和潜在的问题。比如:PInvokeStackImbalance这个MDA能够帮助我们发现PInvoke的声明有问题。StreamWriterBufferedDataLost这个MDA可以帮助我们发现我们忘记调用StreamWriter.Close()方法。 因为很多MDA异常的触发都是在GC回收时进行的,因此表现比较随机。较难重现。 如果你希望自己控制监视哪些MDA异常,可以使用IDE中的Debug->Exceptions->Managing Debugging Assistants来选择捕获哪些MDA异常。如下图: 
    图看不到
    地址http://www.cnblogs.com/Cajon/archive/2007/08/15/Be_Careful_Of_MDA.html
      

  5.   

    http://www.cnblogs.com/winzheng/archive/2008/12/05/1348575.html
      

  6.   

    首先  感谢楼上各位的热心帮助回1楼和5楼:
         感谢你们发的连接  进去看了   上面说换肤控件有可能导致这个问题    我把换肤控件注释掉以后
    问题解决了   不过换肤控件是我这个东西的亮点把  个人比较看重   所以考虑看看改代码结构  
    解决换肤控件引发的MDA异常回2楼:
         呵呵 ,你的办法我在最开始就试了,当时也觉得可能调用窗口的close()方法只是退出窗口,没有退出
    消息循环,所以用你的方法,结果还是一样的,还是很谢谢你回3楼:
        你和4楼的回复最详细,呵呵,你的意思我明白了
    我的这个程序的想法是,启动后,先new一个login对话框,用来执行注册新用户和登录验证,
    对话框退出以后,则对结果进行判断,如果是DialogResult.Yes,则用户选择了登录,直接
    Application.Run(new mainForm()),进入主界面,
    如果结果是DialogResult.Cancel,则用户选择了退出,直接退出程序.回4楼:
        感谢4楼,谢谢你的分享,这时今天最大的收获了,尤其是那句"因为很多MDA异常的触发都是在GC回收时进行的,因此表现比较随机。较难重现。",感觉又进步一些了.今天晚上花点时间,好好了解下MDA,呵呵.