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就不会被记载进来。
目录结构如下:

DLL加载顺序的更多相关文章
- css样式加载顺序及覆盖顺序深入理解
注:内容转载 很多的新手朋友们对css样式加载顺序和覆盖顺序的理解有所偏差,下面用示例为大家详细的介绍下,感兴趣的朋友不要错过 { height: 100%; width: 200; position ...
- 组件推荐Forloop.HtmlHelpers 用来实现MVC的js加载顺序
最近在开发的时候遇到js加载顺序的问题,layui在底部声明了js,但是我想在页面其他地方使用分布视图,分布视图内有自己的js逻辑,发现不能执行,一看就发现,这里的js应该加在layui后面执行才能有 ...
- day16模块,导入模板完成的三件事,起别名,模块的分类,模块的加载顺序,环境变量,from...import语法导入,from...import *,链式导入,循环导入
复习 ''' 1.生成器中的send方法 -- 给当前停止的yield发生信息 -- 内部调用__next__()取到下一个yield的返回值 2.递归:函数的(直接,间接)自调用 -- 回溯 与 递 ...
- dll加载过程全局变量会先初始化
在一个生成dll的工程中看到一个文件只有一句全局变量初始化的代码,很好奇为什么这句代码在dll加载的时候就会执行,因此断点调试发现 __declspec(noinline) BOOL __cdecl ...
- web.xml加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- web.xml文件加载顺序
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...
- DOM加载顺序
最近一直在困扰dom的加载顺序问题,经常会遇到以为绑定好的事件不响应等情况,一头雾水,直到请教了周围的同事,才发现了解dom的加载顺序是多么的重要. 关于这个问题,其实网上已经有一些介绍,但是我觉得并 ...
随机推荐
- SpringBoot初体验及原理解析
一.前言 上篇文章,我们聊到了SpringBoot得以实现的幕后推手,这次我们来用SpringBoot开始HelloWorld之旅.SpringBoot是Spring框架对“约定大于配置(Conv ...
- salesforce lightning零基础学习(六)Lightning Data Service(LDS)
本篇可参看:https://trailhead.salesforce.com/modules/lightning_data_service Lightning中针对object的detail页面,一个 ...
- 从零开始学 Web 之 jQuery(二)获取和操作元素的属性
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- docker 日志方案
docker logs默认会显示命令的标准输出(STDOUT)和标准错误(STDERR).下面使用echo.sh和Dockerfile创建一个名为echo.v1的镜像,echo.sh会一直输出”hel ...
- java反转链表
/** * 遍历,将当前节点的下一个节点缓存后更改当前节点指针 */ public static Node reverse2(Node head) { if (head == null) return ...
- git第七节---git merge和git rebase
# git merge和git rebase 都可以进行分支合并 #git merge 合并后保留记录两个分支的记录 #git rebase合并后会展示成一个分支的记录,另一个分支的提交实际生成了一个 ...
- Docker安装(Debian8)-构建简单的SpringBoot应用
安装docker 1. 建立仓库 移除已安装的docker(docker以前被称为docker或者docker-enginer现在称为docker-ce) apt-get remove docker ...
- 分布式文件系统FastDFS安装教程
前言 FastDFS(Fast Distributed File System)是一款开源轻量级分布式文件系统,本文不讲解原理和架构,只是在个人使用部署过程中耗费了好长时间和精力,遇到了很多的坑,于是 ...
- c# 键值数据保存XML文件
/// <summary> /// 键值数据保存XML文件 /// </summary> /// <param name="fileName"> ...
- Java基础——Servlet(八)文件上传下载
一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 &l ...