1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 22.Silverlight使用WebService调用C++ Delphi编写的DLL文件

22.Silverlight使用WebService调用C++ Delphi编写的DLL文件

时间:2023-04-21 06:28:09

相关推荐

22.Silverlight使用WebService调用C++ Delphi编写的DLL文件

在Silverlight程序(非Out of Browser模式)中是无法直接调用DLL的,但是很多的计算或者其他应用程序的调用中我们需要用到DLL的加载。比如调用DLL来识别×××读卡器传 输过来的信号,比如要和某Delph编写的程序数据通讯等等。本文将简单的自写一个DLL文件,然后通过调用此DLL自定义的一个GetNum函数计算传 入得两个参数之和。

首先我们使用VS编写一个名为IlasLinkDll.dll的C++语言DLL文件(编写这个DLL的源码也会在本章结尾附带),其内部的关键代码如下:

#ifdefMYLIBDLL#defineMYLIBDLLextern"C"_declspec(dllimport)#else#defineMYLIBDLLextern"C"_declspec(dllexport)#endifMYLIBDLLdoubleGetNum(doubleAnum,doubleBnum);doubleGetNum(doubleAnum,doubleBnum){returnAnum+Bnum;}

然后我们新建一个名为SLLinkDLl的Silverlight应用程序项目,在SLLinkDLl.Web项目中我们引用 IlasLinkDll.dll文件,新建一个Wservice.asmx的web服务文件。在此文件中编写以下代码且添加using System.Runtime.InteropServices;的引用:

[WebMethod]publicstringGetNumber(doubleA,doubleB){returnGetNum(A,B).ToString();}///<summary>///获取到DLL的值///</summary>///<paramname="Anumber">数字A</param>///<paramname="Bnumber">数字B</param>///<returns></returns>[DllImport("IlasLinkDll.dll",CharSet=CharSet.Ansi,EntryPoint="GetNum",ExactSpelling=false)]publicstaticexterndoubleGetNum(doubleAnumber,doubleBnumber);

最后在Silverlight程序中鼠标右键点击项目名--添加服务引用--添加http://localhost:4389/Wservice.asmx地址即可。在MainPage.xaml.cs文件中写入以下关键代码即可调用WebService中的GetNumber方法,通过DLL计算两个数字之间的和,返回显示出来。

publicMainPage(){InitializeComponent();//创建webService代理类的对象实例WServiceSoapClientsclient=newWServiceSoapClient();//调用GetNumber方法,并传递两个参数sclient.GetNumberAsync(500,23);sclient.GetNumberCompleted+=newEventHandler<GetNumberCompletedEventArgs>(sclient_GetNumberCompleted);}voidsclient_GetNumberCompleted(objectsender,GetNumberCompletedEventArgse){//结果将为523MessageBox.Show(e.Result);}

通过上面的代码我们传入500和23两个参数。然后得到结果为523的弹出窗口。下面我们看一下加载DLL的DllImport特性的参数使用方法:

[DllImport("IlasLinkDll.dll",CharSet=CharSet.Ansi,EntryPoint="GetNum",ExactSpelling=false)]a、CallingConvention参数指示入口点的调用约定。如果未指定CallingConvention,则使用默认值CallingConvention.Winapi。b、CharSet参数指示用在入口点中的字符集。如果未指定CharSet,则使用默认值CharSet.Auto。c、EntryPoint参数给出dll中入口点的名称。如果未指定EntryPoint,则使用方法本身的名称。d、ExactSpelling参数指示EntryPoint是否必须与指示的入口点的拼写完全匹配。如果未指定ExactSpelling,则使用默认值false。e、PreserveSig参数指示方法的签名应当被保留还是被转换。当签名被转换时,它被转换为一个具有HRESULT返回值和该返回值的一个名为retval的附加输出参数的签名。如果未指定PreserveSig,则使用默认值true。f、SetLastError参数指示方法是否保留Win32"上一错误"。如果未指定SetLastError,则使用默认值false。

Tip:笔者在某一个项目中遇到无论指明什么EntryPoint入口点和CharSet字符集都无法加载一个第三方DLL文件时,就直接自己使用C++ 编写了一个DLL文件来加载这个C#中无法识别加载的第三方DLL,然后在C#中调用自己编写的DLL文件解决了问题。

本实例源码由VS+Silverlight4.0编写,点击 SLLinkDLl.rar下载本实例源码。点击IlasLinkDll.rar 下载DLL文件源码。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。