none
页面加载多个Silverlight导致IE崩溃 RRS feed

  • 常规讨论

  • 请问各位大虾们,

    一个页面中,引用了多个Silverlight,如
    <div>
            <div id="silverlightControlHost">
                <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
                    width="100%" height="100%">
                    <param name="source" value="ClientBin/SilverlightApplication1.xap" />
                    <param name="onError" value="onSilverlightError" />
                    <param name="background" value="white" />
                    <param name="minRuntimeVersion" value="4.0.50826.0" />
                    <param name="autoUpgrade" value="true" />
                    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration: none">
                        <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight"
                            style="border-style: none" />
                    </a>
                </object>
                <iframe id="_sl_historyFrame" style="visibility: hidden; height: 0px; width: 0px;
                    border: 0px"></iframe>
            </div>
        </div>
        <div>
            <div id="Div1">
                <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
                    width="100%" height="100%">
                    <param name="source" value="ClientBin/SilverlightApplication1.xap" />
                    <param name="onError" value="onSilverlightError" />
                    <param name="background" value="white" />
                    <param name="minRuntimeVersion" value="4.0.50826.0" />
                    <param name="autoUpgrade" value="true" />
                    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration: none">
                        <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight"
                            style="border-style: none" />
                    </a>
                </object>
                <iframe id="Iframe1" style="visibility: hidden; height: 0px; width: 0px; border: 0px">
                </iframe>
            </div>
        </div>

       IE 报错  错误如下:

     消息: Unhandled Error in Silverlight Application
    Code: 4004   
    Category: ManagedRuntimeError      
    Message: System.Exception: 对 COM 组件的调用返回了错误 HRESULT E_FAIL。
       位于 MS.Internal.XcpImports.CheckHResult(UInt32 hr)
       位于 MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element, Size availableSize)
       位于 System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
       位于 System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)    

    行: 59
    字符: 13
    代码: 0

    求解决方案。。不胜感激

     

    2011年8月3日 7:15

全部回复

  • 等待ing!~~~~
    2011年8月3日 9:04
  • 你好,

    照理说应该不会出现错误。

    请尝试以下操作:

    1. 不要引用多个Silverlight内容(只包含一个),看看是否会出现同样的错误。如果出现错误,说明是你的Silverlight程序有问题。

    2. 请重新创建一个简单的Silverlight程序,然后再页面多次引用,看看是否会出现同样的问题。


    Daoping Liu - MSFT
    2011年8月5日 2:33
    版主
  • 非常感谢您的回复,希望您能继续关注此问题。

    首先 需求就是一个页面中有多个应用,

    第二 创建的就是非常简单的Silverlight应用,代码如下

     

    <UserControl x:Class="ChineseFontsCauseSilverlightCrash.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d"
      d:DesignHeight="50" d:DesignWidth="50">
    
      <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock Text="中文" />
      </Grid>
    </UserControl>

     

    这个异常非常容易复现,只要在ASPX多次引用使用以上代码的Silverlight应用就会报错。

    经测试这个问题和字体有关:

    如果包含中文,则一个页面包含1到30个左右的SilverLight应用就可能会导致莫名其妙的无法启动的崩溃,

    这个数量不定的,譬如经过测试职业为美工的机子上Silverlight应用数量就少(3个silverlight应用就会崩溃),如果是程序员这个数量就会多一些(达到30个),但达到一定数量崩溃是肯定的

    还有就是如果设置指定的字体(这个字体测试的机子必须存在)如:FontFamily="simSun" ,ASPX 页面上可呈现Silverlight应用个数就会增加,

    经测试一般会增加一倍的数量。

     

    敬候 版主精彩回复 谢谢!~




    2011年8月30日 2:55
  • 我之前测试的时候遇到类似的问题,这个和内存有关系.


    ...
    2011年8月30日 8:50
  • 我之前测试的时候遇到类似的问题,这个和内存有关系.


    ...
    请问 您后来是怎么解决的呢? 请不吝赐教!~
    2011年8月30日 9:37
  • 这个问题应该是规避的问题

    你可以监控一下 比如你看看运行一个用了多少内存 运行10个用了多少内存 运行多少个浏览器会崩 然后根据你机器的内存配置 也就大概能估计出来一台什么样配置的电脑能运行多少个你的程序了.

    你只能取个折中的方案呗

    需要注意的就是你的程序要注意内存的释放 尽量占用较少的资源。

    我最初的demo 刚运行起来消耗内存是150M 运行了一晚上 内存占了1个多G  很奔溃的事.后来注意一下内存释放 最终也就稳定到100多M了

     


    ...
    2011年8月30日 10:05
  • 这个问题应该是规避的问题

    你可以监控一下 比如你看看运行一个用了多少内存 运行10个用了多少内存 运行多少个浏览器会崩 然后根据你机器的内存配置 也就大概能估计出来一台什么样配置的电脑能运行多少个你的程序了.

    你只能取个折中的方案呗

    需要注意的就是你的程序要注意内存的释放 尽量占用较少的资源。

    我最初的demo 刚运行起来消耗内存是150M 运行了一晚上 内存占了1个多G  很奔溃的事.后来注意一下内存释放 最终也就稳定到100多M了

     


    ...

    我们的问题可能不同,我的demo是一个页面中使用到了4个silverlight应用(请不要问为什么不用一个silverlight呢,呵呵,我们的关注点就是一个页面使用多个silverlight应用),而每个silverlight应用都非常简单的控件,而这个页面只是用来展示用的,所以只要页面正常加载以后内存占有量是很稳定的,现在遇到的问题就是,在个别人的电脑打开就会出现异常的情况。异常信息如下:  System.Exception
    Error HRESULT E_FAIL has been returned from a call to a COM component.
       at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
       at MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element, Size availableSize)
       at System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
       at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)。

    最后经测试发现这个问题是很容易出现的,与使用中文字体有关,如果换成英文字体就没问题了。

    2011年8月31日 0:35