解决Silverlight无法调试的问题

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

解决Silverlight无法调试的问题

解决Silverlight无法调试的问题

本文来自Kevin Yang博客作者:Kevin Yang

问题描述

在Silverlight开发过程中,经常时不时的会碰到Silverlight无法调试的问题。我就遇到下面几种情况:

1. Web Application+Silverlight,F5进入调试状态之后无法跟进Silverlight程序中下的断点

2. 项目中有两个Silverlight工程,其中一个Silverlight程序中有一个鼠标点击事件会将当前页面导航到另外一个Silverlight程序的承载页面。第一个Silverlight程序断点正常,但是第二个Silverlight程序中的断点不能自动停下来

3. 无论是在TestPage模式下调试还是在Web工程上调试,只要打开了Silverlight调试开关,那么启动的时候会提示“Unable to start debugging. Cannot locate Microsoft Internet Explorer”。如果你是直接Ctrl+F5运行,有时候也会出现一样的问题。

单个Silverlight工程无法调试

对于第一个问题,请检查如下设置是否正确:

1. 确认启用了Silverlight调试。双击工程中的属性文件夹打开属性设置页,找到Web一栏,在此页卡的最下面有几个调试选项,如下图所示:

确认最后一项“Silverlight”之前的勾是勾上的。

2. 确保浏览器访问的Xap包是最新的。检查IE是否已经清除了缓存,或者ClientBin中的Xap因为某些原因没能更新(如因配置管理导致无法覆盖)

3. 检查工程是否绑定了Silverlight应用。可以通过工程的属性面板中的Silverlight Application 页卡查看是否绑定成功。如下:

4. 检查Silverlight工程的StartupObject是否设置正确。有时候我们对工程的命名空间进行重命名,会导致Silverlight应用程序的入口对象失效,从而导致无法启动等情况。

IE8下无法同时调试多个Silverlight工程?!

IE8和以往的IE不大一样,它的多标签是采用多进程的方式来实现的。整个窗口是一个框架进程,每个Tab标签页是一个独立的子进程(实际上,IE8会根据内存动态控制Tab进程的数目,因此多个标签页可能会共存于同一个进程之中)。当你尝试在多个标签页中打开不同的Silverlight应用程序时,例如从SilverlightApplication1中打开新页面到SilverlightApplication2页面,这个时候你会发现,SilverlightApplication2应用程序无法调试。

这是因为,Visual Studio除了启动窗口进程之外,不会自动帮我们Attach其他的包含Silverlight应用程序的进程,如果我们需要在多个标签页(或者多个窗口)中同时调试不同的Silverlight应用程序,那么我们必须自己手动Attach这些进程。

举个简单的例子,我有两个Silverlight工程,其中SilverlightApplication1中包含链接指向SilverlightApplication2页面,点击链接会在新标签页中打开SilverlightApplication2的承载页面。

为了Attach相应的进程,首先我们需要找到SilverlightApplication2承载页面对应的进程。打开ProcessExplorer,我们可以看到三个进程。

其中的ID为4528的是父进程,也就是框架进程,用于管理不同的标签进程之间的通信等事务。5160和5248分别对应着两个标签页进程。至于哪个对应哪个我们在这里无法根据进程号确定。

我们再打开Visual Studio中的Attach窗口(菜单=>Debug=>Attach to process…)

这里列出了所有系统可用的进程清单,我们可以看到三个IE进程,其中一个是灰色的,这表示了这个进程已经被Attach到Visual Studio的调试器上了。排除了框架进程4258外,就剩下5248这个进程了,这个进程就是我们要找的SilverlightApplication2对应的承载页面的进程了。选中之后Attach到调试器上,我们发现,SilverlightApplication2中的断点还是显示为空心红圈,依然无法调试。

这是因为我们指定的进程代码类型不正确。我们注意到,上图中最上面有一个Attach to,后面显示的是Automatic,这个代表着Visual Studio的调试器会自动帮我们选择进程的调试类型,例如是托管代码调试,还是脚本调试,等等。我们选中5248这个进程,发现Visual Studio给我们选择的方式是脚本调试。

在Visual Studio中,脚本调试和Silverlight调试是不能共存的,这也就是为什么有时候你按下F5的时候,Visual Studio会提示你,调试Silverlight程序会暂时关闭脚本调试的功能。因此在脚本调试下,我们无法跟进Silverlight 应用程序的断点。

这里额外说一点,IE8高级选项中的禁用脚本调试设置对Visual Studio一点影响都没有,因为Visual Studio 2008在调试器启动的时候会自动启用脚本调试(可以通过注册表禁用此特性),除非在Web Application属性中打开了Silverlight调试。

回到刚才的问题,由于Visual Studio帮我们自动选择的调试类型有误,导致我们无法调试SilverlightApplication2,因此我们需要手动指定Attach类型。点击Attach to后侧的select按钮。

在弹出的选择代码类型窗口中勾选上Silverlight。确定之后再次Attach,我们发现,这一次,断点真的起作用了。当然,如果这种方式比较麻烦的话,我们也可以通过改变IE8的Tab进程创建方式来让不同标签页共存于一个进程中。在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main下面有一个TabProcGrowth 键值(DWORD类型),当其设置为0时,IE框架和Tab工作在一个进程里面,Tab采用线程的方式创建,同时IE的保护模式(Protect Mode)会关闭。TabProcGrowth=1时IE框架和Tab工作在不同的进程里面。TabProcGrowth>1时,此值将决定IE8最多创建的Tab进程数目。如果TabProcGrowth 不存在,则会根据可用的物理内存数量决定Tab进程的数量。

调试时无法打开IE窗口的问题

这个问题是我最近才遇到的,我也不知道为什么突然之间,我的Silverlight工程按下F5的时候无法调试,弹出下面这个对话框:Unable to start debugging. Cannot locate Microsoft Internet Explorer.

如果直接运行,那么能够打开,但是打开之后Visual Studio还是会弹出一样的错误。

相关文档
最新文档