开发托管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了。