开发托管ActiveX或第三方程序托管插件时调试问题解决方法

问题描述:

用VS2010开发ActiveX控件,项目属性里,调试设置为:

    启动外部程序:C:\Program Files\Internet Explorer\iexplore.exe

    命令行参数:-noframemerging -nohangrecovery http://localhost/PrintSettingTest.htm

目标框架设置为2.0时,可调试,断点可命中,模块列表可看见待调试托管dll已经加载,一切正常。

但之后按照部署要求,目标框架统一改为.NET 4.0,问题出现了,无法命中任何断点,调试时模块列表为空,初步判断VS2010调试器加载调试引擎的

框架版本选择错误,未正确识别,google了一大堆,找到建立iexplore.exe.config并加入如下配置,强制指定clr版本的方法:

1 <?xml version="1.0"?>
2 <configuration>
3     <startup useLegacyV2RuntimeActivationPolicy="true">
4         <supportedRuntime version="v4.0"/>
5     </startup>
6 </configuration>

测试无效。又建立了TestActiveX.dll.config,内容如上,同样无效。

后尝试在欲调试代码前加入代码:

1             Debugger.Launch();
2             Debugger.Break();

运行,出现如下错误:

 

 听他的,分离再附加:

 

 

可见模块正常加载,可以调试并命中断点。

但每次都要手动附加貌似非常麻烦哦,继续google,找到好方法:
http://through-the-interface.typepad.com/through_the_interface/2010/04/hitting-breakpoints-in-net-class-libraries-while-debugging-with-visual-studio-2010.html

解决方法:

因为我的托管dll的宿主是IE,那么我在解决方案上点右键,添加-》现有项目,定位到 C:\Program Files\Internet Explorer\ 并选择 iexplore.exe

在iexplore项目上右键:

然后把iexplore设为启动项。

注意,到此并未结束,因为IE8开始每个网页Tab都会开新进程,导致当只打开一个网页调试会出现一个框架进程,我们得取消他。使用下面的注册表取消:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN]

"TabProcGrowth"=dword:00000000
;当不调试时用以下字段代替以上字段
;"TabProcGrowth"=-

把注册表另存为REG文件,并导入。这下你就可以痛痛快快地调试托管dll了。

 

 

posted @ 2012-04-26 01:12  BinSys  阅读(1634)  评论(0编辑  收藏  举报