Silverlight陷阱:注意程序集引用問題

作者: Shuhari  來源: 博客園  發布時間: 2009-11-11 21:03  閱讀: 3747 次  推薦: 0   原文鏈接   [收藏]  
摘要:本文介紹了Silverlight中程序集引用的問題

  假定我要用Silverlight類庫實現一些通用控件,然后在應用程序中引用這個控件庫。當然,控件通常也要訪問其他一些第三方或開源的開發包,例如Silverlight Toolkit。

  于是這個項目的依賴關系如下: Silverlight Application => Silverlight Control => Silverlight Toolkit。在Visual Studio中創建好項目之間的引用關系:

  然后在類庫項目中創建一個簡單的控件,比如:

<UserControl x:Class="SLLib.TestControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:controlsToolkit
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit" 
    
>
    <Grid x:Name="LayoutRoot">
        <controlsToolkit:DockPanel>
        controlsToolkit:DockPanel>
    Grid>
UserControl>

  最后,在應用程序中添加我們剛剛創建的控件:

<UserControl x:Class="TestSL.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"
    xmlns:lib="clr-namespace:SLLib;assembly=SLLib">
    
    
<Grid x:Name="LayoutRoot">
        <lib:TestControl />
    Grid>
    
UserControl>

  這么簡單的程序(一行代碼也沒有),不可能出問題吧?可惜事實上不是這樣:

  原因在哪呢?我們打開.xap 文件看看,就會發現問題:Toolkit程序集竟然沒有被包含進來!這樣控件運行的時候是無法找到DockPanel類的,程序自然就出錯了。

 

  我們可以從其他方面來驗證這個錯誤。刪掉原來的控件(其實不刪也可以) ,從代碼創建一個控件:

public class TestControl2 : ContentControl
{
    
public TestControl2()
    {
        
this.Content = new DockPanel();
    }
}

   然后把程序中的TestControl換成TestControl2,再試試看怎么樣?運行正常!.xap文件現在也包含Toolkit了:

  另一方面,如果我們在應用程序的引用中手工加上System.Windows.Controls.Toolkit,那么程序也可以運行正常。

  這些跡象表明,Silverlight編譯器實在有點自作聰明。即使我們在類庫引用中明確指定了要引用的程序集,編譯器也會忽略這些指示,只查找代碼中使用到的那些。對于你在.xaml中引用的程序集,編譯器根本不予理會。讓情況更加惡化的是,如果運行時找不到類,那么Silverlight運行時只會拋出臭名卓著的AG_E_PARSER_BAD_TYPE,這個毫無內容的錯誤信息對查找問題沒有什么幫助。奇怪的是對于Application類型的項目,Silverlight編譯器的做法則完全不同——只要在項目引用中加入了任何程序集,無論實際上是否被用到,都會編譯到最終的.xap文件中。這種不一致的行為是你應當小心的。

  此問題最簡單的work around就是:只要在類庫中引用了哪些程序集,在應用程序中也保證引用同樣的程序集,就可以避免出現錯誤。顯然這不是一個很理想的辦法,不僅因為它迫使程序員重復做一些沒有實際意義的工作,也使得類庫的使用者不得不去關心類庫的內部機制,從而讓類庫的存在意義大打折扣。

0
1
 
標簽:Silverlight
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()