如何使用Silverlight加载动态库并发布到IIS7.docx

上传人:b****1 文档编号:12724665 上传时间:2023-04-21 格式:DOCX 页数:27 大小:1,017.84KB
下载 相关 举报
如何使用Silverlight加载动态库并发布到IIS7.docx_第1页
第1页 / 共27页
如何使用Silverlight加载动态库并发布到IIS7.docx_第2页
第2页 / 共27页
如何使用Silverlight加载动态库并发布到IIS7.docx_第3页
第3页 / 共27页
如何使用Silverlight加载动态库并发布到IIS7.docx_第4页
第4页 / 共27页
如何使用Silverlight加载动态库并发布到IIS7.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

如何使用Silverlight加载动态库并发布到IIS7.docx

《如何使用Silverlight加载动态库并发布到IIS7.docx》由会员分享,可在线阅读,更多相关《如何使用Silverlight加载动态库并发布到IIS7.docx(27页珍藏版)》请在冰豆网上搜索。

如何使用Silverlight加载动态库并发布到IIS7.docx

如何使用Silverlight加载动态库并发布到IIS7

使用Silverlight加载动态库并发布到IIS7

开发环境搭建

创建动态库

Silverlight之加载动态库

Silverlight之日志功能

Silverlight之IIS的安装

Silverlight之发布

⏹开发环境搭建

本程序采用VisualStudio2010Ultimate+Silverlight4为开发环境,VS2010下载地址参考\\192.168.75.5\共享软件\常用软件\visualstudio,安装方法不再详述,Silverlight4_Tools下载地址参考

1.安装VS2010

2.安装Silverlight4_Tools

安装时如果遇到如下错误:

请不要灰心,将Silverlight4_Tools.exe改为Silverlight4_Tools.zip,则可以发现这就是一个压缩包,文件内容如下:

●首先安装VS10-KB982218-v4.exe

●接着安装silverlight_sdk.msi

●再安装Silverlight_Developer.exe

为了验证Silverlight是否已经安装成功,打开VS2010,单击File->New->Project->VisualC#,选择SilverlightApplication,如图:

一路往下:

打开MainPage.xaml.cs,在InitializeComponent行设置断点,

按下F10,看看是否能够调试,如果有错误提示,则说明安装的Silverlight的Developer和RunTime版本不一致,请下载SilverlightDeveloper和RunTime运行时库,本才程序使用的版本为4.0.605310,有需要者可联系(xfli@),如果提示不能安装,则将先前安装的版本卸载后重新安装。

4.0.608310下载地址为(http:

//222.218.45.50:

82/down/Silverlight.zip),至此,silverlight开发环境搭建完毕。

⏹创建动态库

首先,为了测试Silverlight加载动态库,我们打开VS2010,编一个动态库出来,步骤如下:

File->New->Project->VisualC++->Win32ConsoleApplication,将工程命名为load_dll,如图:

单击ok,单击Next,在ApplicationSettings选择Dll,如图:

单击Finish,完成动态库的创建。

为了测试,我们在load_dll.cpp文件中添加两个函数,命名为add_number,sub_number,代码如下:

选择工程load_dll,右键->Add->NewItem->VisualC++->Code->Module-DefinitionFile,将其命名为load_dll,如图

单击Add,添加如下代码:

单击Build->BuildSolution,完成动态库的创建。

⏹Silverlight之加载动态库

打开VS2010,单击File->New->Project->VisualC#->SilverlightApplication,将工程命名为load_dll,如图:

在弹出的对话框中单击OK

完成load_dll工程的创建。

打开load_dll.Web下的ClientBin目录,将先前创建的load_dll.dll文件拷贝到ClientBin目录下,选择ClientBing,右键->Add->ExistItem选择拷贝过来的load_dll.dll,将其添加到ClientBin目录中。

为了能够在工程中加载动态库,右键load_dll.Web->Add->NewItem,在弹出的对话框中选择OnlineTemplates->选择WebService,命名为WebService1.asmx,如图:

单击Add,完成asmx文件的添加。

在WebService1.asmx.cs文件中添加如下代码:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Web;

usingSystem.Web.Services;

usingSystem.Runtime.InteropServices;

namespaceload_dll.Web

{

///

///SummarydescriptionforWebService1

///

[WebService(Namespace="http:

//tempuri.org/")]

[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]

[System.ComponentModel.ToolboxItem(false)]

//ToallowthisWebServicetobecalledfromscript,usingASP.NETAJAX,uncommentthefollowingline.

//[System.Web.Script.Services.ScriptService]

publicclassWebService1:

System.Web.Services.WebService

{

conststringDllPath="G:

/learn/silverlight/load_dll/load_dll.Web/ClientBin/load_dll.dll";

[WebMethod]

publicstringHelloWorld()

{

return"HelloWorld";

}

[WebMethod]

publicintSLAddNumber(inta,intb)

{

returnadd_number(a,b);

}

[WebMethod]

publicintSLSubNumber(inta,intb)

{

returnsub_number(a,b);

}

[DllImport(DllPath,CharSet=CharSet.Ansi,EntryPoint="add_number",ExactSpelling=false)]

publicexternintadd_number(inta,intb);

[DllImport(DllPath,CharSet=CharSet.Ansi,EntryPoint="sub_number",ExactSpelling=false)]

publicexternintsub_number(inta,intb);

}

}

可以看出DllPath被设置为绝对路径,为什么这么设后面再说。

右键load_dll.Web->Build,如果没有出现错误则表示成功了一半,这个一定要编译,否则下面的工作无法继续,选中load_dll工程,右键->AddServiceReference,如图:

单击Discover,将自动列出WebService.asmx,双击MainPage.xaml,在Form上添加两个按钮,一个设为相加,一个设为相减,并分别双击,添加如下代码:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Net;

usingSystem.Windows;

usingSystem.Windows.Controls;

usingSystem.Windows.Documents;

usingSystem.Windows.Input;

usingSystem.Windows.Media;

usingSystem.Windows.Media.Animation;

usingSystem.Windows.Shapes;

usingload_dll.ServiceReference1;

namespaceload_dll

{

publicpartialclassMainPage:

UserControl

{

publicMainPage()

{

InitializeComponent();

}

privatevoidbutton1_Click(objectsender,RoutedEventArgse)

{

//创ä¡ä建¡§webService代䨲理¤¨ª类¤¨¤的Ì?

对?

象¨®实º¦Ì例¤y

WebService1SoapClientsclient=newWebService1SoapClient();

sclient.SLAddNumberAsync(100,50);

sclient.SLAddNumberCompleted+=newEventHandler(show_add);

}

publicvoidshow_add(objectsender,SLAddNumberCompletedEventArgse)

{

MessageBox.Show((e.Result).ToString());

}

privatevoidbutton2_Click(objectsender,RoutedEventArgse)

{

//创ä¡ä建¡§webService代䨲理¤¨ª类¤¨¤的Ì?

对?

象¨®实º¦Ì例¤y

WebService1SoapClientsclient=newWebService1SoapClient();

sclient.SLSubNumberAsync(100,50);

sclient.SLSubNumberCompleted+=newEventHandler(show_sub);

}

publicvoidshow_sub(objectsender,SLSubNumberCompletedEventArgse)

{

MessageBox.Show((e.Result).ToString());

}

}

}

按下F7键,编译成功后,CTRl+F5运行即可看到如下效果:

⏹Silverlight之日志功能

由于安全性的原因,silverlight不能直接进行文件操作,所以记录日志也就成了一个问题,需要借助插件来完成日志记录的功能,本文使用NLog工具写日志。

1.NLog的安装(http:

//nlog-project.org/),下载后即可安装

2.为了验证NLog是否安装成功,关闭load_dll工程并重新打开,右键load_dll->Add->NewItem->VisualC#->Nlog(如果没有出现表示安装没有成功,需要重新安装)->NLogConfigurerationFile添加将日志保存到文件的配置文件,如图:

添加成功后,打开MainPage.xaml.cs,修改代码如下:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Net;

usingSystem.Windows;

usingSystem.Windows.Controls;

usingSystem.Windows.Documents;

usingSystem.Windows.Input;

usingSystem.Windows.Media;

usingSystem.Windows.Media.Animation;

usingSystem.Windows.Shapes;

usingload_dll.ServiceReference1;

usingNLog;

namespaceload_dll

{

publicpartialclassMainPage:

UserControl

{

privatestaticLoggerlogger=LogManager.GetCurrentClassLogger();

publicMainPage()

{

InitializeComponent();

}

privatevoidbutton1_Click(objectsender,RoutedEventArgse)

{

//创ä¡ä建¡§webService代䨲理¤¨ª类¤¨¤的Ì?

对?

象¨®实º¦Ì例¤y

WebService1SoapClientsclient=newWebService1SoapClient();

sclient.SLAddNumberAsync(100,50);

sclient.SLAddNumberCompleted+=newEventHandler(show_add);

}

publicvoidshow_add(objectsender,SLAddNumberCompletedEventArgse)

{

MessageBox.Show((e.Result).ToString());

logger.Info((e.Result).ToString());

}

privatevoidbutton2_Click(objectsender,RoutedEventArgse)

{

//创ä¡ä建¡§webService代䨲理¤¨ª类¤¨¤的Ì?

对?

象¨®实º¦Ì例¤y

WebService1SoapClientsclient=newWebService1SoapClient();

sclient.SLSubNumberAsync(100,50);

sclient.SLSubNumberCompleted+=newEventHandler(show_sub);

}

publicvoidshow_sub(objectsender,SLSubNumberCompletedEventArgse)

{

MessageBox.Show((e.Result).ToString());

logger.Info((e.Result).ToString());

}

}

}

打开App.xaml.cs,添加如下代码:

usingNLog;

usingNLog.Config;

usingNLog.Targets;

usingNLog.Layouts;

privatevoidApplication_Startup(objectsender,StartupEventArgse)

{

InitializeNLog();

this.RootVisual=newMainPage();

}

privatevoidInitializeNLog()

{

SimpleConfigurator.ConfigureForTargetLogging(

newFileTarget()

{

FileName="${specialfolder:

MyDocuments}/logs/${shortdate}.log",

Layout=newCsvLayout()

{

Columns=

{

newCsvColumn("Time","${longdate}"),

newCsvColumn("Level","${level}"),

newCsvColumn("Lessage","${message}"),

newCsvColumn("Logger","${logger}"),

},

}

},

LogLevel.Debug);

}

打开load_dll的工程属性,设置为OOB模式,方法为:

右键load_dll->Properties

至此日志功能添加完成,为了验证日志是否真正的输出了,运行工程并打开C:

\Users\Administrator\Documents\logs,可以看到已经输出了日志。

⏹Silverlight之IIS的安装

为了能够运行ASP.NET服务,需要在部署机器上安装IIS服务,这里只说明如何在Windows7上安装IIS服务,方法如下:

单击开始->控制面板->程序->打开或关闭windows功能,在弹出的对话框上选择Internet信息服务->万维网服务->应用程序开发功能->ASP.NET,如图:

Windows7系统上安装好IIS服务后,默认就支持.asmx,和.xaml扩展名的文件,在XP系统上或者Server机器上部署IIS时,还需添加对上述两种扩展名的支持,具体可用IIS和MIME为关键字搜索即可获得方法。

在浏览器输入:

http:

//127.0.0.1,如果出现IIS的欢迎界面,则说明IIS服务安装成功。

右键我的电脑->管理->服务和应用程序->Iternet信息服务,可以看到IIS已经为我们创建好了一个DefaultWebSite站点。

⏹Silverlight之发布

前面,我们已经完成了名为load_dll的Silverlight工程,现在我们要将其部署到IIS服务站点,还记得上面说过的动态库的加载路径的问题,这里我们不能写为绝对路径,需要设置为虚拟的路径,这样客户端在访问服务端时才能访问加载到这个动态库,将先前的代码修改如下:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Web;

usingSystem.Web.Services;

usingSystem.Runtime.InteropServices;

namespaceload_dll.Web

{

publicclassDllInvoke

{

[DllImport("kernel32.dll")]

privateexternstaticIntPtrLoadLibrary(Stringpath);

[DllImport("kernel32.dll")]

privateexternstaticIntPtrGetProcAddress(IntPtrlib,StringfuncName);

[DllImport("kernel32.dll")]

privateexternstaticboolFreeLibrary(IntPtrlib);

publicDelegateInvoke(StringAPIName,Typet)

{

IntPtrapi=GetProcAddress(hLib,APIName);

return(Delegate)Marshal.GetDelegateForFunctionPointer(api,t);

}

privateIntPtrhLib;

publicDllInvoke(StringDLLPath)

{

hLib=LoadLibrary(DLLPath);

}

~DllInvoke()

{

FreeLibrary(hLib);

}

}

///

///SummarydescriptionforWebService1

///

[WebService(Namespace="http:

//tempuri.org/")]

[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]

[System.ComponentModel.ToolboxItem(false)]

//ToallowthisWebServicetobecalledfromscript,usingASP.NETAJAX,uncommentthefollowingline.

//[System.Web.Script.Services.ScriptService]

publicclassWebService1:

System.Web.Services.WebService

{

publicdelegateintProc_add_number(inta,intb);

publicdelegateintProc_sub_number(inta,intb);

//conststringDllPath="G:

/learn/silverlight/load_dll/load_dll.Web/ClientBin/load_dll.dll";

[WebMethod]

publicstringHelloWorld()

{

return"HelloWorld";

}

[WebMethod]

publicintSLAddNumber(inta,intb)

{

DllInvokeinvoke=newDllInvoke(Server.MapPath(@"~/ClientBin/load_dll.dll"));

Proc_add_numberadd_number=(Proc_add_number)invoke.Invoke("add_number",typeof(Proc_add_number));

returnadd_number(a,b);

}

[WebMethod]

publicintSLSubNumber(inta,intb)

{

DllInvokeinvoke=newDllInvoke(Server.MapPath(@"~/ClientBin/load_dll.dll"));

Proc_sub_numbersub_number=(Proc_sub_number)invoke.Invoke("sub_number",typeof(Proc_sub_number));

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1