Windows下的dll与lib
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文件如下:1
2
3LIBRARY sys.dll
EXPORTS
Check_permission
C#项目使用
引入相关命名空间:1
using System.Runtime.InteropServices;
在C#中可如下导入:1
2[ ]
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[ ]
public static extern int Check_permission(string id, string password, int type);
[ ]
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
本文标题:Windows下的dll与lib
文章作者:Raincorn
发布时间:2020-05-13
最后更新:2020-07-28
原始链接:https://blog.raincorn.top/2020/05/13/Windows_DLL_INK/
版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可