Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】

简介:

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

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

复制代码

#ifdef MYLIBDLL
#define MYLIBDLL extern "C" _declspec(dllimport)
#else
#define MYLIBDLL extern "C" _declspec(dllexport)
#endif
MYLIBDLL
double GetNum(double Anum,double Bnum);

double GetNum(double Anum,double Bnum)
{

return Anum+Bnum;
}
复制代码

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

复制代码

[WebMethod]
public string GetNumber(double A,double B)
{
return GetNum(A, B).ToString() ;

}
/// <summary>
/// 获取到DLL的值
/// </summary>
/// <param name="Anumber">数字A</param>
/// <param name="Bnumber">数字B</param>
/// <returns></returns>
[DllImport("IlasLinkDll.dll", CharSet = CharSet.Ansi, EntryPoint = "GetNum", ExactSpelling = false)]
public static extern double GetNum(double Anumber, double Bnumber);
复制代码

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

复制代码

public MainPage()
{
InitializeComponent();
//创建webService代理类的对象实例
WServiceSoapClient sclient=new WServiceSoapClient();
//调用GetNumber方法,并传递两个参数
sclient.GetNumberAsync(500,23);
sclient.GetNumberCompleted
+= new EventHandler<GetNumberCompletedEventArgs>(sclient_GetNumberCompleted);

}

void sclient_GetNumberCompleted(object sender, GetNumberCompletedEventArgs e)
{
//结果将为523
MessageBox.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文件解决了问题。

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



    本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/03/09/1978288.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章