1、如何使用Silverlight加载动态库并发布到IIS7使用Silverlight加载动态库并发布到IIS7开发环境搭建创建动态库Silverlight之加载动态库Silverlight之日志功能Silverlight之IIS的安装Silverlight之发布 开发环境搭建本程序采用Visual Studio 2010 Ultimate + Silverlight 4为开发环境,VS 2010下载地址参考192.168.75.5共享软件常用软件visual studio,安装方法不再详述,Silverlight4_Tools下载地址参考1. 安装VS20102. 安装Silverlight4_
2、Tools安装时如果遇到如下错误:请不要灰心,将Silverlight4_Tools.exe改为Silverlight4_Tools.zip,则可以发现这就是一个压缩包,文件内容如下: 首先安装VS10-KB982218-v4.exe 接着安装silverlight_sdk.msi 再安装Silverlight_Developer.exe为了验证Silverlight是否已经安装成功,打开VS2010,单击File-New-Project-Visual C#,选择Silverlight Application,如图:一路往下:打开MainPage.xaml.cs,在InitializeComp
3、onent行设置断点,按下F10,看看是否能够调试,如果有错误提示,则说明安装的Silverlight的Developer和RunTime版本不一致,请下载Silverlight Developer 和RunTime运行时库,本才程序使用的版本为4.0.605310,有需要者可联系(xfli),如果提示不能安装,则将先前安装的版本卸载后重新安装。4.0.608310下载地址为(http:/222.218.45.50:82/down/Silverlight.zip),至此,silverlight开发环境搭建完毕。 创建动态库首先,为了测试Silverlight加载动态库,我们打开VS 2010,
4、编一个动态库出来,步骤如下:File-New-Project-Visual C+-Win32 Console Application,将工程命名为load_dll,如图:单击ok,单击Next,在Application Settings选择Dll,如图:单击Finish,完成动态库的创建。为了测试,我们在load_dll.cpp文件中添加两个函数,命名为add_number,sub_number,代码如下:选择工程load_dll,右键-Add-New Item-Visual C+-Code-Module- Definition File,将其命名为load_dll,如图单击Add,添加如下代
5、码:单击Build-Build Solution,完成动态库的创建。 Silverlight之加载动态库打开VS 2010,单击File-New-Project-Visual C#-Silverlight Application,将工程命名为load_dll,如图:在弹出的对话框中单击OK完成load_dll工程的创建。打开load_dll.Web下的ClientBin目录,将先前创建的load_dll.dll文件拷贝 到ClientBin目录下,选择ClientBing,右键-Add-Exist Item选择拷贝过来的load_dll.dll,将其添加到ClientBin目录中。为了能够在工
6、程中加载动态库,右键load_dll.Web-Add-New Item,在弹出的对话框中选择Online Templates-选择Web Service,命名为WebService1.asmx,如图:单击Add,完成asmx文件的添加。在WebService1.asmx.cs文件中添加如下代码:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;using System.Runtime.InteropServices;namespac
7、e load_dll.Web / / Summary description for WebService1 / WebService(Namespace = http:/tempuri.org/) WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1) System.ComponentModel.ToolboxItem(false) / To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following l
8、ine. / System.Web.Script.Services.ScriptService public class WebService1 : System.Web.Services.WebService const string DllPath = G:/learn/silverlight/load_dll/load_dll.Web/ClientBin/load_dll.dll; WebMethod public string HelloWorld() return Hello World; WebMethod public int SLAddNumber(int a, int b)
9、return add_number(a, b); WebMethod public int SLSubNumber(int a, int b) return sub_number(a, b); DllImport(DllPath, CharSet = CharSet.Ansi, EntryPoint = add_number, ExactSpelling = false) public extern int add_number(int a, int b); DllImport(DllPath, CharSet = CharSet.Ansi, EntryPoint = sub_number,
10、ExactSpelling = false) public extern int sub_number(int a, int b); 可以看出DllPath被设置为绝对路径,为什么这么设后面再说。右键load_dll.Web-Build,如果没有出现错误则表示成功了一半,这个一定要编译,否则下面的工作无法继续,选中load_dll工程,右键-Add Service Reference,如图:单击Discover,将自动列出WebService.asmx,双击MainPage.xaml,在Form上添加两个按钮,一个设为相加,一个设为相减,并分别双击,添加如下代码:using System;us
11、ing System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using load_dll.ServiceReference1;
12、namespace load_dll public partial class MainPage : UserControl public MainPage() InitializeComponent(); private void button1_Click(object sender, RoutedEventArgs e) /创建webService代理类的?对?象实例y WebService1SoapClient sclient = new WebService1SoapClient(); sclient.SLAddNumberAsync(100, 50); sclient.SLAddN
13、umberCompleted += new EventHandler(show_add); public void show_add(object sender, SLAddNumberCompletedEventArgs e) MessageBox.Show(e.Result).ToString(); private void button2_Click(object sender, RoutedEventArgs e) /创建webService代理类的?对?象实例y WebService1SoapClient sclient = new WebService1SoapClient();
14、sclient.SLSubNumberAsync(100, 50); sclient.SLSubNumberCompleted += new EventHandler(show_sub); public void show_sub(object sender, SLSubNumberCompletedEventArgs e) MessageBox.Show(e.Result).ToString(); 按下F7键,编译成功后,CTRl+F5运行即可看到如下效果: Silverlight之日志功能由于安全性的原因,silverlight不能直接进行文件操作,所以记录日志也就成了一个问题,需要借助插
15、件来完成日志记录的功能,本文使用NLog工具写日志。1. NLog的安装(http:/nlog-project.org/),下载后即可安装2. 为了验证NLog是否安装成功,关闭load_dll工程并重新打开,右键load_dll-Add-New Item-Visual C#-Nlog(如果没有出现表示安装没有成功,需要重新安装)-NLog Configureration File添加将日志保存到文件的配置文件,如图:添加成功后,打开MainPage.xaml.cs,修改代码如下:using System;using System.Collections.Generic;using Syste
16、m.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using load_dll.ServiceReference1;using NLog;namespace load_dll public parti
17、al class MainPage : UserControl private static Logger logger = LogManager.GetCurrentClassLogger(); public MainPage() InitializeComponent(); private void button1_Click(object sender, RoutedEventArgs e) /创建webService代理类的?对?象实例y WebService1SoapClient sclient = new WebService1SoapClient(); sclient.SLAdd
18、NumberAsync(100, 50); sclient.SLAddNumberCompleted += new EventHandler(show_add); public void show_add(object sender, SLAddNumberCompletedEventArgs e) MessageBox.Show(e.Result).ToString(); logger.Info(e.Result).ToString(); private void button2_Click(object sender, RoutedEventArgs e) /创建webService代理类
19、的?对?象实例y WebService1SoapClient sclient = new WebService1SoapClient(); sclient.SLSubNumberAsync(100, 50); sclient.SLSubNumberCompleted += new EventHandler(show_sub); public void show_sub(object sender, SLSubNumberCompletedEventArgs e) MessageBox.Show(e.Result).ToString(); logger.Info(e.Result).ToStri
20、ng(); 打开App.xaml.cs,添加如下代码:using NLog;using NLog.Config;using NLog.Targets;using NLog.Layouts;private void Application_Startup(object sender, StartupEventArgs e) InitializeNLog(); this.RootVisual = new MainPage(); private void InitializeNLog() SimpleConfigurator.ConfigureForTargetLogging( new FileTa
21、rget() FileName = $specialfolder:MyDocuments/logs/$shortdate.log, Layout = new CsvLayout() Columns = new CsvColumn(Time, $longdate), new CsvColumn(Level, $level), new CsvColumn(Lessage, $message), new CsvColumn(Logger, $logger), , , LogLevel.Debug); 打开load_dll的工程属性,设置为OOB模式,方法为:右键load_dll-Properties
22、至此日志功能添加完成,为了验证日志是否真正的输出了,运行工程并打开C:UsersAdministratorDocumentslogs,可以看到已经输出了日志。 Silverlight之IIS的安装为了能够运行ASP.NET服务,需要在部署机器上安装IIS服务,这里只说明如何在Windows 7上安装IIS服务,方法如下:单击开始-控制面板-程序-打开或关闭windows功能,在弹出的对话框上选择Internet信息服务-万维网服务-应用程序开发功能-ASP.NET,如图:Windows 7 系统上安装好IIS 服务后,默认就支持.asmx,和.xaml扩展名的文件,在XP系统上或者Server
23、机器上部署IIS时,还需添加对上述两种扩展名的支持,具体可用IIS 和MIME为关键字搜索即可获得方法。在浏览器输入:http:/127.0.0.1,如果出现IIS的欢迎界面,则说明IIS服务安装成功。右键我的电脑-管理-服务和应用程序-Iternet 信息服务,可以看到IIS已经为我们创建好了一个Default Web Site站点。 Silverlight之发布前面,我们已经完成了名为load_dll的Silverlight工程,现在我们要将其部署到IIS服务站点,还记得上面说过的动态库的加载路径的问题,这里我们不能写为绝对路径,需要设置为虚拟的路径,这样客户端在访问服务端时才能访问加载到
24、这个动态库,将先前的代码修改如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;using System.Runtime.InteropServices;namespace load_dll.Web public class DllInvoke DllImport(kernel32.dll) private extern static IntPtr LoadLibrary(String path); DllImport(kern
25、el32.dll) private extern static IntPtr GetProcAddress(IntPtr lib, String funcName); DllImport(kernel32.dll) private extern static bool FreeLibrary(IntPtr lib); public Delegate Invoke(String APIName, Type t) IntPtr api = GetProcAddress(hLib, APIName); return (Delegate)Marshal.GetDelegateForFunctionPo
26、inter(api, t); private IntPtr hLib; public DllInvoke(String DLLPath) hLib = LoadLibrary(DLLPath); DllInvoke() FreeLibrary(hLib); / / Summary description for WebService1 / WebService(Namespace = http:/tempuri.org/) WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1) System.ComponentModel.Tool
27、boxItem(false) / To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. / System.Web.Script.Services.ScriptService public class WebService1 : System.Web.Services.WebService public delegate int Proc_add_number(int a, int b); public delegate int Proc_sub_
28、number(int a, int b); / const string DllPath = G:/learn/silverlight/load_dll/load_dll.Web/ClientBin/load_dll.dll; WebMethod public string HelloWorld() return Hello World; WebMethod public int SLAddNumber(int a, int b) DllInvoke invoke = new DllInvoke(Server.MapPath(/ClientBin/load_dll.dll); Proc_add
29、_number add_number = (Proc_add_number)invoke.Invoke(add_number, typeof(Proc_add_number); return add_number(a, b); WebMethod public int SLSubNumber(int a, int b) DllInvoke invoke = new DllInvoke(Server.MapPath(/ClientBin/load_dll.dll); Proc_sub_number sub_number = (Proc_sub_number)invoke.Invoke(sub_number, typeof(Proc_sub_number);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1