zoukankan      html  css  js  c++  java
  • 艾伟_转载: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就是:只要在类库中引用了哪些程序集,在应用程序中也保证引用同样的程序集,就可以避免出现错误。显然这不是一个很理想的办法,不仅因为它迫使程序员重复做一些没有实际意义的工作,也使得类库的使用者不得不去关心类库的内部机制,从而让类库的存在意义大打折扣。

  • 相关阅读:
    pgspider sqlite mysql docker 镜像
    pgspider docker 镜像
    pgspider基于pg 的高性能数据可视化sql 集群引擎
    diesel rust orm 框架试用
    golang 条件编译
    Performance Profiling Zeebe
    bazel 学习一 简单java 项目运行
    一个好用node http keeplive agnet
    gox 简单灵活的golang 跨平台编译工具
    mailhog 作为smtp server mock工具
  • 原文地址:https://www.cnblogs.com/waw/p/2157050.html
Copyright © 2011-2022 走看看