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

10 篇文章 1 订阅

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程序。










  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 平台上,可以通过使用 JNI(Java Native Interface)来调用 C++ 动态链接库DLL)。JNI 是一个 Java 虚拟机规范,用于实现 Java 代码与本地代码的交互。通过 JNI,可以在 Java 中声明本地方法,并将其实现委托给本地代码,以便在 Java 中调用本地方法。 要在 Android 中调用 C++ DLL,需要先将 DLL 编译为适用于 Android 平台的共享库(.so 文件),然后在 Java 代码中使用 JNI 调用该共享库。具体步骤如下: 1. 在 C++ 中编写动态链接库,并将其编译为适用于 Android 平台的共享库(.so 文件)。 2. 在 Java 中声明 native 方法,以便在 Java 中调用 C++ 方法。例如: ```java public class MyNativeClass { public native int myNativeMethod(int arg); } ``` 3. 在 C++ 中实现该方法,并将其封装为静态库(.a 文件)或共享库(.so 文件)。 4. 将 C++ 库与 Java 代码链接,并打包为 Android 应用程序。 5. 在 Java 代码中,使用 System.loadLibrary() 方法加载 C++ 库,并调用 native 方法。例如: ```java public class MyJavaClass { static { System.loadLibrary("MyNativeLibrary"); } public static void main(String[] args) { MyNativeClass myNativeClass = new MyNativeClass(); int result = myNativeClass.myNativeMethod(42); System.out.println("Result: " + result); } } ``` 需要注意的是,JNI 调用 C++ 方法的过程中,需要进行参数类型转换和内存管理等操作,因此需要谨慎处理。另外,由于 Android 平台涉及多种架构,需要针对不同的架构编译对应的共享库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值