动态加载Silverlight应用的dll文件(可实现插件功能)

动态加载Silverlight应用的dll文件(可实现插件功能),第1张

概述  在Mike Taulty的视频教程中有一个动态加载silverlight应用程序的DEMO,其程序运行效果如下:      当加载dll之后:        其实实现这个的效果本身并不难,主要是这个DEMO的应用场景可以让人做很大的扩展,比如说插 件机制等.   好了,让我们看看如何实际去开发这个示例,以便让大家从流程和技术点上有个了解.   首先我们需要建立一个叫DynamicLoading

  在Mike Taulty的视频教程中有一个动态加载silverlight应用程序的DEMO,其程序运行效果如下:

     当加载dll之后:

  


 
  其实实现这个的效果本身并不难,主要是这个DEMO的应用场景可以让人做很大的扩展,比如说插
件机制等.

  好了,让我们看看如何实际去开发这个示例,以便让大家从流程和技术点上有个了解.
  首先我们需要建立一个叫DynamicLoading的silverlight Application, 然后将如下的内容拷贝
到Page.xaml中:

 

< UserControl  x:Class ="DynamicLoading.Page"
    xmlns
="http://schemas.microsoft.com/clIEnt/2007"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"  
    WIDth
="400"  Height ="300" >
    
GrID  x:name ="LayoutRoot"  Background ="White"
       
GrID.RowDeFinitions 
            
RowDeFinition  />
        
</ GrID.RowDeFinitions
        
       
StackPanel
          
    
                
TextBox  WIDth ="200"  x:name ="txtPlugIn"  margin ="10"  Text ="Implementation.dll"   button  HorizontalAlignment ="Center"  WIDth ="96"  Content ="加载DLL"  
   Click
="OnClick"

            
GrID   GrID.Row ="1" ="AliceBlue" ="20" ="grIDHosting"
            
            
GrID StackPanel   VerticalAlignment ="Bottom" TextBlock  ="txtToEdit"  FontSize ="16"  FontStyle ="italic"   Text ="编辑内容"  
  TextAlignment
="center"  HorizontalAlignment ="Stretch"  GrID.Row ="2"  
  VerticalAlignment
="Center"
UserControl

     然后我们需要先建立一个接口文件(类似于插件接口),所以在当前SLN下新加一个Silverlight Class
library 项目,名称为:Interfaces
 .将class.cs文件改名为:IEditText.cs .
将如下接口内容拷贝到该cs文件中:
  

public class  TextChangedEventArgs : EventArgs
    {
        
string  Text {  get set ; }
    }

    
interface  IEditText
    {
        UIElement GetControls();
        
voID  SetText(  text);
        
event  EventHandler < TextChangedEventArgs >  TextChanged;
    }

  编译这个接口项目.接下来我们将会实现这个接口(相当于实际的插件功能).
我们再新建一个叫Implementation的Silverlight Class library 项目,重命名class.cs文件为Editor.cs
,将如下内容拷贝到项目的cs文件中:
 

 Editor : Interfaces.IEditText
{
    TextBox textBox;

      Editor()
    {
        textBox 
= new  TextBox();
    }

    
// 插件运行时加载的控件(界面)       UIElement GetControls()
    {
        StackPanel Panel 
 StackPanel();

        StackPanel stackPanel 
 StackPanel();
        stackPanel.margin 
 Thickness( 5 );
        stackPanel.OrIEntation 
 OrIEntation.Horizontal;

        textBox 
 TextBox();
        textBox.WIDth 
  300 ;
        textBox.Height 
70 ;
        button button 
 button();
        button.Content 
" 点击这里 " ;
        button.Click 
+=  OnbuttonClick;
        button.WIDth 
60 ;

        stackPanel.Children.Add(textBox);
        Panel.Children.Add(stackPanel);
        Panel.Children.Add(button);

        
return  Panel;
    }

    
 text)
    {
        textBox.Text 
 text;
    }

    
将点击提交按钮时,更新相应的界面内容  OnbuttonClick( object  sender, EventArgs args)
    {
        
if  (TextChanged  != null )
        {
            TextChanged(
this  Interfaces.TextChangedEventArgs()
            {
                Text 
 textBox.Text
            });
        }
    }
    
Interfaces.TextChangedEventArgs  TextChanged;
}

  之后,我们编译一下译项目.

  下面看一下加载上面类库的代码(位于Page.xaml.cs文件中):   

partial  Page : UserControl
{
    
 Page()
    {
        InitializeComponent();
    }

点击加载按钮事件  OnClick( 获取要加载的dll文件信息           assembly   txtPlugIn.Text;
        WebClIEnt clIEnt 
 WebClIEnt();
        
准备获取dll文件的信息         clIEnt.OpenReadCompleted   OnReadCompleted;
        clIEnt.OpenReadAsync(
 Uri(assembly, UriKind.relative));
    }

    
 OnReadCompleted(  AssemblyPart();
        
获取加载的dll信息(stream格式)         Assembly assembly   part.Load(e.Result);
构造该对象(插件)的实例         IEditText editor 
             assembly.CreateInstance(
Implementation.Editor as  IEditText;

        
 (editor  )
        {  
加载其中的控件(grIDHosting类型为<GrID>)             grIDHosting.Children.Add(editor.GetControls());
            editor.SetText(txtToEdit.Text);
            
完成事件绑定             editor.TextChanged   OnTextChanged;
        }
    }
    
    
内容更新  OnTextChanged(  e.Text;
    }
}

    当然要编译还要引用一下前面写的接口项目(Interfaces),这样代码部分就完成了.这里我们还
要将类库Implementation.dll(插件)放入web项目中的ClIEntBin文件夹下.这样我们就可以运行文章
开始处的页面了.

  是不是很简单,这里面主要的一块内容就是使用WebClIEnt读取dll文件,如下:

WebClIEnt clIEnt   WebClIEnt();
clIEnt.OpenReadCompleted 
 OnReadCompleted;
clIEnt.OpenReadAsync(
其它的内容都是小Case:)

    好了,今天的内容就到这里了,感兴趣的朋友可以一起来讨论:)

    源码下载请 点击这里:)

总结

以上是内存溢出为你收集整理的动态加载Silverlight应用的dll文件(可实现插件功能)全部内容,希望文章能够帮你解决动态加载Silverlight应用的dll文件(可实现插件功能)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1055800.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存