c#创建、使用Dll动态链接库

最近因为项目需要,需要调用一个动态链接库,由于以前没有接触过,也不知道如何编写调用DLL,特此记录下学习笔记。


一、什么是DLL以及使用它的好处

1 DLL (DynamicLink Library )

DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。(来自百度)

2 DLL的好处

1)当程序越来越庞大时,DLL避免了EXE文件的过大。分成DLL之后,不用把全部功能都集中到EXE里,需要的时候才调入内存。
2)DLL模块化了生产程序。DLL是产品,EXE就是个集装箱。因此对DLL模块的更新只需要替换此DLL文件即可,不用更新整个程序。
3)编译EXE时,不用编译DLL的内容,加快了编译速度。
4)DLL可重用。当一个DLL模式设计好之后,可以被其它项目或程序所引用。
5)DLL可以起到保密的作用。也就是说DLL可以将实现功能的源代码隐藏起来,调用者只能使用而不能看到其内部代码。

上述可能说的有些难懂,下面是项目开发遇到的难题,其中就是选择DLL连接库,可以感性认识DLL的好处:

发生的背景

在开发新项目中使用了新的语言开发C#和新的技术方案WEB Service,但是在新项目中,一些旧的模块需要继续使用,一般是采用C或C++或Delphi编写的,如何利用旧模块对于开发人员来说,有三种可用方法供选择:

第一、将C或C++函数用C#彻底改写一遍,这样整个项目代码比较统一,维护也方便一些。但是尽管微软以及某些书籍说,C#和C++如何接近,但是改写起来还是很痛苦的事情,特别是C++里的指针和内存操作;

第二、将C或C++函数封装成COM,在C#中调用COM比较方便,只是在封装时需要处理C或C++类型和COM类型之间的转换,也有一些麻烦,另外COM还需要注册,注册次数多了又可能导致混乱;

第三、将C或C++函数封装成动态链接库,封装的过程简单,工作量不大。

因此我决定采用加载动态链接库的方法实现,于是产生了在C#中如何调用自定义的动态链接库问题,我在网上搜索相关主题,发现一篇调用系统API的文章,但是没有说明如何解决此问题,在MSDN上也没有相关详细说明。基于此,我决定自己从简单出发,逐步试验,看看能否达到自己的目标。

“动态链接”这几字指明了DLLs是如何工作的。对于常规的函数库,链接器从中拷贝它需要的所有库函数,并把确切的函数地址传送给调用这些函数的程序。而对于DLLs,函数储存在一个独立的动态链接库文件中。在创建Windows程序时,链接过程并不把DLLs文件链接到程序上。直到程序运行并调用一个DLLs中的函数时,该程序才要求这个函数的地址。此时Windows才在DLLs中寻找被调用函数,并把它的地址传送给调用程序。采用这种方法,DLLs达到了复用代码的极限。


二、在VS2010中如何创建和编写DLL

方法很简单,就是在程序的解决方案中添加一个项目,然后选择“类库”。注意,一定要在“解决方案”上添加项目才行,在项目中只能添加类文件了。类库项目一但添加,在程序编译的时候就会自动生成为DLL文件。

编写DLL这和编写类文件代码是一致的。你可以在多个CS类文件中编写,也可以全放在一起CS类文件中编写。当然推荐的方式是根据功能分类将类库分别写在不同的CS文件中。(虽然在不同文件中,但同属一个项目的类文件会被编译进一个DLL库文件中)


三、在VS2010中如何使用自己编写的DLL

方法也很简单,在你的程序中的解决方案管理器里,找到“引用”然后点右键添加,在弹出的对话框中选择“浏览”,然后选择你刚才创建并编译过的DLL文件。然后在程序文件中使用using 来引入你DLL中的命名空间。注:如果DLL项目就在你当前的程序解决方案中,那么你可以直接在添加“引用”中选择“项目”而不是“浏览”。这样就可以直接引用本解决方案中编写的DLL类库。


上述都是文字描述,有兴趣的需要尝试自己编写DLL并调用的同学可以参考

http://jingyan.baidu.com/article/6525d4b1091539ac7d2e9407.html,上面有最简单的例程,我牛刀小试了一下,正确完成!


四.c#调用Matlab生成的DLL

1、创建一个简单的.m文件

打开Matlab 2009a,新建一个.m文件,输入如下代码:

function result=twice(inputvar);
result=2*inputvar;

将代码保存为twice.m文件,如图所示。

image

2、使用Matlab DeployTool生成.Net组件

在Matlab 2009a的Command Window中输入deploytool并回车,如图所示。

image

就可以打开Matlab的DeployTool,如图所示。

image

在DeployTool窗体中,点击新建按钮,打开新建项目对话框,如图所示。

image

在左边的列表中选择MATLAB Builder NE,并在右边的列表中选择.NET Component,我们将这个工程命名为twice.prj,并点击OK,则进入项目设置界面,如图所示。

image

在Twice文件夹中添加我们刚才建好的.m文件,如图所示。

image

点击编译按钮或使用快捷键Ctrl+B则对该工程进行编译。编译完成后的主窗口如图所示。

image

3、创建一个测试用的Windows应用程序,将其命名为MatlabTest,如图所示。

image

4、添加对MWArray.dll的引用

MWArray.dll一般位于[Matlab安装位置]\R2009a\toolbox\dotnetbuilder\bin\win32\v2.0文件夹中,我们注意到Matlab 2009a对应的MWArray.dll是2.9.0.0版本的。在进行Matlab版本升级的时候,比较头疼的就是这个dll。

image

因为版本升级意味着之前生成的dll都需要重新生成。关于版本升级的问题,我将在后面的博文中详细介绍。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值