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