C#编写动态链接库类库dll文件

来源:互联网 发布:淘宝招聘兼职 编辑:程序博客网 时间:2024/06/08 08:32

1、DLL 即:动态链接库
  DLL是Dynamic Link 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可以将实现功能的源代码隐藏起来,调用者只能使用而不能看到其内部代码。

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

3.DLL的调用

DLL(动态链接库)的调用可以分为两种:一种是隐式调用,一种是显示调用。

  1、隐式的调用

  这种调用方式需要把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,在使用DLL中的函数时,只须说明一下后就可以直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。隐式调用不需要调用LoadLibrary()和FreeLibrary()。程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。

  当程序员通过隐式调用方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号被写入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序也将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。所有被应用程序调用的DLL文件都会在应用程序EXE文件加载时被加载在到内存中。

  2、显式调用

  这种调用方式是指在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态连接库调进来,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序在调用GetProcAddress函数时使用这一参数。当完成对动态链接库的导入以后,再使用GetProcAddress()获取想要引入的函数,该函数将符号名或标识号转换为DLL内部的地址,之后就可以象使用本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态连接库。

4.方法/步骤(来源于百度)

打开vs2015菜单栏新建->项目,选择C#编程环境下的类库,起名叫imageprocess,准备做一个图片处理的类



2.将class后面的类名改为imagepro(注意是改引用下class1的文件名为imagepro,然后系统会弹出一个确认框,点确认即可),每个.cs文件包含一个类,每个类又会包含很多方法,那么这个图片处理的类imagepro里可以写无数个方法即函数,下面我们先演示一个图片取反的方法




3.Bitmap类型定义一张图片,我们发现缺乏相关引用,于是在解决方案的引用文件夹里右键添加引用,从.Net库里把System.Drawing添加进来,然后在using里加上using System.Drawing





4.下面我们在imagepro类里添加方法Reverse,Reverse函数的类型就是Bitmap,直接返回处理后的图片,这个方法是给图片像素取反,类似底片的效果

然后我们在Reverse函数里添加如下代码

public Bitmap Reverse(Bitmap image)
 {
  for (int i = 0; i < image.Width; i++) //循环遍历宽
            {
                for (int j = 0; j < image.Height; j++)//循环遍历高度
                {
                    Color pix = image.GetPixel(i, j);//获取图像像素值
                    int r = 255 - pix.R;//像素值取反
                    int g = 255 - pix.G;//转换颜色
                    int b = 255 - pix.B; //转换颜色
                    image.SetPixel(i, j, Color.FromArgb(r, g, b));//保存像素值
                }
}
       return image;
 }


5.最后菜单栏选择生成->生成imageprocess,或者按shift+F6快捷键生成imageprocess.dll,那么这个dll文件就可以被其他c#程序引用了包括asp.net程序。










0 0