登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: vs2008 clr 编译的巨大好处     [回主站]     [分站链接]
标题
vs2008 clr 编译的巨大好处
clq
浏览(0) + 2010-04-05 10:32:54 发表 编辑

关键字:

void Ct3Dlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    try{

    char * p = new char[1];

    int i = 0;
    i = 10/i;//这个错误在 clr 下能检测出

    //tm * m = NULL;
    //i = m->tm_hour;//这个错误在 clr 下能检测出

    p += 5;//这个错误在 clr 下也没有检测出来//但是当 p 指针访问偏移太多,达到不可访问区时会报异常而不是崩溃

    p += 5000;//但是当 p 指针访问偏移太多,达到不可访问区时会报异常而不是崩溃
    *p = 'a';

    printf("aaa%s", p);

    }catch(...){}//这个可以跳过以上的 clr 异常
}

clq
2010-4-5 10:34:53 发表 编辑

仅仅是简单的在项目 "常规" "属性" 中加入 "公共语言运行库支持(/clr)"  支持就可以得到如此巨大的好处,实在是太划算了!

clq
2010-4-5 13:52:20 发表 编辑

clr 的程序需要两个包来运行:
1. vs2008 运行库 否则会有 [由于应用程序配置不正确 应用程序未能启动。重新安装应用程序可能会纠正这个问题] 错误。
文件名为 vcredist_x86.exe 安装 vs2008 会有的,在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\vcredist_x86 下。
2. 至少 .net 2.0 安装包.

clq
2010-4-5 14:07:55 发表 编辑

.net 2.0 有 20m 在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFX 下有,如果是 3.5 的话就太大了,要上百 m.

clq
2010-4-5 15:45:36 发表 编辑

clr 对内存区的检查并不是万能的,我一个用到了 gd 库的服务器改成 clr 并加 try catch(...) 后仍然崩溃,仔细检查后发现是对 new char[len] 的 char  * 执行了 gdFree() 造成的。

clq
2010-4-5 16:10:00 发表 编辑

如何打印错误信息呢?


void tt1()
{
    // TODO: 在此添加控件通知处理程序代码
    //try{

    char * p = new char[1];

    //int i = 0;
    //i = 10/i;//这个错误在 clr 下能检测出

    //tm * m = NULL;
    //i = m->tm_hour;//这个错误在 clr 下能检测出

    p += 5;//这个错误在 clr 下也没有检测出来//但是当 p 指针访问偏移太多,达到不可访问区时会报异常而不是崩溃

    p += 50000;//但是当 p 指针访问偏移太多,达到不可访问区时会报异常而不是崩溃
    *p = 'a';

    printf("aaa%s", p);

    //}catch(...){}//这个可以跳过以上的 clr 异常
}


void Ct3Dlg::OnBnClickedButton1()
{
    //tt1();//
    // TODO: 在此添加控件通知处理程序代码
    try{ 
        tt1();//

    return;
    char * p = new char[1];

    //int i = 0;
    //i = 10/i;//这个错误在 clr 下能检测出

    //tm * m = NULL;
    //i = m->tm_hour;//这个错误在 clr 下能检测出

    p += 5;//这个错误在 clr 下也没有检测出来//但是当 p 指针访问偏移太多,达到不可访问区时会报异常而不是崩溃

    p += 50000;//但是当 p 指针访问偏移太多,达到不可访问区时会报异常而不是崩溃
    *p = 'a';

    printf("aaa%s", p);

    //}catch(...){}//这个可以跳过以上的 clr 异常
    }catch(System::Exception ^ ex)
    {
        //ex->Source'
        printf("%s", ex->StackTrace);
        printf("%s", ex->Message);
    }//这个可以跳过以上的 clr 异常
   
}

这样会显示出错的位置,不过如果有函数调用的话,只能显示调用的位置.
另外 vs2008 的 release 版本是默认支持调试信息的。

clq
2010-4-5 16:10:36 发表 编辑

错误信息类似于:

   在 tt1() 位置 d:\test1\t3\t3\t3dlg.cpp:行号 168
   在 Ct3Dlg.OnBnClickedButton1(Ct3Dlg* ) 位置 d:\test1\t3\t3\t3dlg.cpp:行号 181
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。



总数:6 页次:1/1 首页 尾页  
总数:6 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1