什么是DLL文件?
DLL(Dynamic Link Library,动态链接库)是Windows操作系统中用于共享代码和资源的文件格式。通过调用DLL,多个程序可以复用相同的函数,节省内存并便于维护。
C/C++ 中调用 DLL
在 C/C++ 中,通常有两种方式调用 DLL:静态链接(.lib + .dll)和动态加载(LoadLibrary + GetProcAddress)。
动态加载示例:
#include <windows.h>
#include <stdio.h>
typedef int (*AddFunc)(int, int);
int main() {
HMODULE hDll = LoadLibrary(L"mylib.dll");
if (hDll) {
AddFunc add = (AddFunc)GetProcAddress(hDll, "Add");
if (add) {
printf("Result: %d\n", add(3, 4));
}
FreeLibrary(hDll);
}
return 0;
}
C# 中调用 DLL
在 C# 中可通过 DllImport 特性调用非托管 DLL 中的函数。
using System;
using System.Runtime.InteropServices;
class Program {
[DllImport("mylib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Add(int a, int b);
static void Main() {
Console.WriteLine("Result: " + Add(3, 4));
}
}
Python 中调用 DLL
使用 Python 的 ctypes 模块可以轻松加载和调用 DLL 函数。
import ctypes
mylib = ctypes.CDLL('./mylib.dll')
mylib.Add.argtypes = (ctypes.c_int, ctypes.c_int)
mylib.Add.restype = ctypes.c_int
result = mylib.Add(3, 4)
print("Result:", result)
常见问题与注意事项
- 确保 DLL 文件与调用程序架构一致(x86/x64)。
- 导出函数需使用
__declspec(dllexport)声明。 - 注意调用约定(如
cdecl、stdcall)的一致性。 - 路径问题:建议将 DLL 放在系统 PATH 或程序目录下。