之前的文章中讲述过从DLL中导出变量,其中包括了静态加载和动态加载。
C#调用C++动态链接库同样分为静态加载和动态加载。
fellen的博客“WPF中使用MFC动态链接库(dll)函数”中讲述的是如何C#静态加载DLL,即需要将C++代码编译生成的Dll放在C#程序的Bin目录下,并在引入函数的位置加入[DllImport(“xxx.dll”)] 。
由于Dll路径的限制,使用的不是很方便,C#中我们经常通过配置动态的调用托管Dll,例如常用的一些设计模式:Abstract Factory, Provider, Strategy模式等等,那么是不是也可以这样动态调用C++动态链接呢?只要您还记得在C++中,通过LoadLibrary, GetProcess, FreeLibrary这几个函数是可以动态调用动态链接的(它们包含在kernel32.dll中),那么问题迎刃而解了。
首先看一下LoadLibrary, GetProcAddress, FreeLibrary这三个函数:
HMODULE WINAPI LoadLibrary ( LPCTSTR lpFileName);
说明:
载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源
返回值
lpLibFileName String,指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序
一旦不需要,用FreeLibrary函数释放DLL
FARPROC