dll为动态链接库对应Linux下的.so文件,lib为静态链接库对应.a文件。

前言

在课程设计中,借助dll以将C编写的函数提供给C#使用。

Windows

Windows下obj,lib,dll,exe之间的关系。

obj

在C的多文件编程下,一个完整的程序会被划分为若干个子部分。在编译器编译的时候需要分别对每个源文件进行编译,生成若干个obj文件。

lib

多个obj文件和并生成lib文件,即为静态编译库,在编译的时候即被加入可执行文件。

dll

A dynamic-link library (DLL) is a module that contains functions and data that can be used by another module (application or DLL).

为了减少资源占用,增强后期可维护性,DLL可在程序运行的时候调用。当多个应用程序同时调用该dll时,可共享内存空间减少资源占用。

exe

lib在编译时被加入exe,dll在执行时动态调用并分享,优缺点对比如下:

  • lib无需后续分发,dll则需要实时调用。
  • lib被编译进exe导致其体积较大,dll则可以根据使用情况来调用且可以与其他程序共享。同时由于dll可以独立分发,使得其后期维护变得简单。

在VS中使用DLL

C导出DLL

先将项目属性中的项目类型设定为dll,再配置项目的def文件,写入向外部暴露的函数:

def配置
我的项目def文件如下:

1
2
3
LIBRARY sys.dll
EXPORTS
Check_permission

C#项目使用

引入相关命名空间:

1
using System.Runtime.InteropServices;

在C#中可如下导入:
1
2
[DllImport("sys.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Check_permission(string id, string password, int type);

其中DllImport的可选属性如下:

  • CallingConvention参数:指示入口点的调用约定,如果未指定CallingConvention,则使用默认值CallingConvention.Winapi;
  • CharSet参数:指示用在入口点种的字符集。如果未指定CharSet,则使用默认值CharSet.Auto;
  • Point参数:给出所声明的方法在dll中入口点的名称。如果未指定EntryPoint,则使用方法本身的名称;
  • ExactSpelling参数:指示EntryPoint是否必须与指示的入口点的拼写完全匹配。如果未指定ExactSpelling,则使用默认值false;
  • PreserveSig参数:指示方法的签名应被应当被保留还是被转换。当签名被转换时,它被转换为一个具有HRESULT返回值和该返回值的一个名为retval的附加输出参数签名。如果未指定PreserveSig,则使用默认值false;
  • SetLastError参数:指示方法是否保留Win32上的错误,如果未指定SetLastError,则使用默认值false。

如需从DLL中导入多个函数,则需要多次导入DLL,如下:

1
2
3
4
[DllImport("sys.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Check_permission(string id, string password, int type);
[DllImport("sys.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr hash(string str);

Linux

  • .o类似于.obj
  • .a类似于.lib
  • .so类似于.dll

参考文献

https://oldpan.me/archives/linux-a-so-o-tell
https://blog.csdn.net/yyz_2637/article/details/5340365
https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-libraries