在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文件源码。

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

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

    在Silverlight程序(非Out of Browser模式)中是无法直接调用DLL的,但是很多的计算或者其他应用程序的调用中我们需要用到DLL的加载.比如调用DLL来识别×××读卡器传 输过 ...

  2. Silverlight实用窍门大集合+Silverlight 5 最全新特性【目录索引】

    在最近的几个月内整理出了Silverlight的一些相关的比较实用的功能讲解文章,并且随着Silverlight 5 beta版本的发布整理出的新特性系列文章,在这里做一个总的概括和索引,以方便大家观 ...

  3. Silverlight实用窍门系列:59.多个中心点联动多线的可拖动控件扩展为拓扑图

    在本系列的第17篇文章中"Silverlight实用窍门系列:17.中心点联动多线的可拖动控件(绘制工程图.拓扑图基础) ",制作了基本的中心联动图标.有园友对此图的扩展不是很清晰 ...

  4. Silverlight实用窍门系列:71.Silverlight的Style

    此文章实例基于Silverlight实用窍门系列:68.Silverlight的资源字典ResourceDictionary,如有数据源疑问请参考该文章. 在Silverlight中的Style相当于 ...

  5. Silverlight实用窍门系列:56.Silverlight中的Binding使用(一)【附带实例源码】

    本文将详细讲述Silverlight中Binding,包括Binding的属性和用法,Binding的数据流向. Binding:一个完整的Binding过程是让源对象中的某个属性值通过一定流向规则进 ...

  6. Silverlight实用窍门系列:29.Silverlight碰撞测试、检测自定义控件碰撞,雷达扫描图之扫描雷达点状态【附带源码实例】...

    雷达扫描图中当雷达指针转动扫描到某一个点上的时候,判断这个点的CPU值是否已经超过60的警戒位置如果超过将此点设置为红色. 在Silverlight中我们的雷达指针是一直在做圆运动的,我们要随时检测雷 ...

  7. Silverlight实用窍门系列:14.Visifire图表控件的使用一(图表的创建和基础使用)【附带源码实例】...

    在实际项目开展中,往往会牵扯到需要绘制图表的情况.而Visifire是一个比较美观大方的第三方图表控件,本文会讲述如何初步使用Visifire控件. 首先我们需要从Visifire的官方网站下载:ht ...

  8. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地

    在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能. 下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地. 一.在Silv ...

  9. Silverlight实用窍门系列:61.Silverlight中的Trigger触发器,自定义翻页触发器

    在Silverlight应用程序和客户进行交互工作的时候可以不用写后台代码而通过Xaml代码来实现,在本文我们将学习了解Trigger触发器. Trigger触发器:引发动作的因素,比如鼠标点击.键盘 ...

最新文章

  1. pytorch以特征图的输入方式训练LSTM模型
  2. 电脑连接示波器读取数据
  3. silverlight项目工作小结
  4. git学习(三)版本的前进后退
  5. oracle jde优势介绍,Oracle JDE EnterpriseOne模块的详细功能介绍
  6. 2020h黑苹果 y7000p_【黑苹果】联想Lenovo Legion Y7000 Y530系列笔记本,EFI文件下载
  7. 计算机视觉三大国际会议ICCV、ECCV、CVPR
  8. [转]结婚戒指为什么戴在无名指?
  9. NET CORE Learning
  10. 企业邮箱怎么开通?手机微信怎么绑定公司邮箱?
  11. proftpd mysql_Proftpd mysql认证配置文档
  12. Mac OS 系统瘦身 - xcode 清理
  13. jquery字符串相等判断
  14. SSL/TLS连接建立过程
  15. 网络ioctl实践3:设置网卡的mac、ip、子网掩码、广播地址
  16. 使用百度翻译api制作自己的字典
  17. Kafka设计解析(十三)Kafka消费组(consumer group)
  18. Flavor在多子module的项目环境下,依赖冲突的处理
  19. VISA (传款易 paydollar ) 支付
  20. 网络攻击窃密案高发,没有留存网络日志小心越红线

热门文章

  1. 46:八进制到十进制
  2. Android Fragment详解(二):Fragment创建及其生命周期
  3. 谈谈Visual Studio的缺点,比较Eclipse
  4. R语言报错:Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : n行没有x元素
  5. 计算机软件和程序设计基本知识,计算机语言与程序设计
  6. python交互式命令_在python中运行交互式命令
  7. python knn-基于python实现KNN分类算法
  8. python遍历文件夹下所有文件大小_python遍历文件夹读取文件大小 | 学步园
  9. 揭阳电网要求计算机二级吗,2018年3月广东省揭阳市计算机等级考试考务通知
  10. apk可以解压再复制到手机吗_不行了,这个打通手机和电脑的神器,必须得安利给你们...