dll加载顺序

  最近碰到了一个问题,要引入一个第三方的SDK,但是SDK中使用的一些dll和我原本程序里面有些dll是同名的,而且本程序的dll和sdk的dll名称都不能修改。

  解决这个问题,首先想到的就是多进程,这就用到了我们之前开发的一个专门用来托管dll的进程。先是将SDK打包到另外一个单独的目录(因为与本程序中的dll名称冲突),随后写了一个包装SDK的dll,把这个dll给了托管进程。

  这样既使用了SDK的功能,又把第三方的程序隔离开了,看似不错的解决方案。

  但是遇到了另外一个问题,我的托管进程也是在exe的目录下的,所以他的默认加载顺序还是exe所在路径为最优先,这样隐式加载还是会先加载该目录下的同名dll,这样会导致SDK所在的托管进程无法启动。

  所以再加一道程序: 在包装SDK的dll工程里面设置要加载的SDK dll为延迟加载,然后在调用sdk方法前手动loadlibrary加载SDK的dll,这样后面exe目录下的同名dll就不会被加载了。

  总结一下有一下几点:

  1. 隐式加载会按照标准顺序加载,无法通过代码修改加载顺序

  2. dll延迟加载,会在dll中导出方法第一次被调用的时候加载,所以在这之前有机会修改加载顺序。

  3. 除了LoadLibraryEx用LOAD_WITH_ALTERED_SEARCH_PATH这个参数加载dll之外,没有其他方法可以影响exe目录为最优先的顺序(SetCurrentDirectory, SetDllDirectory)

  4. 同名的dll只会被加载一次,只有所有加载同名的dll都会被忽略。所以利用这个特性,就可以做一些事情。比如延迟加载,先加载自己的,后面系统再去加载的时候发现已经加载了,后续的dll就不会被记载进来。

  

  目录结构如下:

猜你喜欢

转载自www.cnblogs.com/zuiaichuichuifeng/p/9104336.html