我的问题与Windows和Windows上的动态库加载('abc.dll'或'abc.so')有关。 Linux环境。
我有一个dll或共享内存。我有两个应用程序必须使用此DLL(abc.dll或abc.so)。 现在我已将此dll(abc.dll或abc.so)的副本放在各自的可执行文件夹中:
/folder-one/app1.exe
/folder-one/abc.dll (resp. abc.so)
/folder-two/app2.exe
/folder-two/abc.dll (resp. abc.so)
现在,当我运行app1.exe
时,它会从abc
&中加载folder-one
- 库(abc.dll或abc.so)。运行。
现在当我运行app2.exe
时,它会加载abc
- 库(abc.dll或abc.so)从folder-two
&运行。
Q-1现在我的问题是,当两个应用程序都运行时,是否会加载两个dll副本?
Loader加载linux和Linux中内存中的共享库(abc.dll或abc.so)。窗户环境。 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
问题2将共享库(abc.dll或abc.so)作为相应文件夹中的单个副本是否有缺点?
Q-3如果我想从两个应用程序加载一个dll,那么应该是什么共同位置(因此两个应用程序都可以找到它)?
答案 0 :(得分:0)
Q-1现在我的问题是,当两个应用程序都运行时,会有两个dll副本加载吗?
是的,库将被加载两次,因为它们位于不同的位置(并且名称本身不足以使其唯一)。
Q-2将(abc.dll或abc.so)作为相应文件夹中的单独副本有缺点吗?
主要内存消耗,因为代码将被复制(当然每个副本都有自己的数据)。这是一种简化,因为它不是必须共享代码(并且它在Linux和Windows之间是不同的)。通常,只读部分是共享的,读/写部分是私有的(然后是重复的)。
此外,由于加载期间发生的基本开销(内存分配,地址重定位,依赖关系的解析等),加载时间更长。
不要忘记这也将适用于每个依赖项(如果它们部署在您正在使用的库的同一文件夹中)。
最后,您应该考虑部署和更新。这可以是pro或con,但不要忘记共享库只能更新一次,它将升级所有相关的应用程序;如果它已经仔细完成,那么它就是专家,但如果更新可能会破坏现有代码,那就是一个骗局。例如,可以管理此问题,包括名称中的版本号(当您更改版本时,则不会授予兼容性。)
Q-3如果我从两个应用程序加载dll那么应该在公共位置?
是。库的名称和位置唯一标识库。在这种情况下,它不会被加载到内存中两次。
答案 1 :(得分:0)
在Windows上,如果已经加载了一个dll而你加载了一个具有相同模块名称的dll,它将返回已加载的dll并且不会打扰搜索。
在系统搜索DLL之前,它会检查以下内容:
如果已在内存中加载了具有相同模块名称的DLL,则系统将使用加载的DLL,无论它在哪个目录中。 系统不会搜索DLL。
如this very long MSDN page中所述(乍一看似乎只是关于Windows撕毁应用程序,但它确实谈到了我认为至少没有从Win7改变的桌面模式)
但是,我认为这取决于现在很多事情:你运行的是Windows应用商店应用程序,还是.net dll或win32 dll。我知道.net使用探测系统来定位dll。然后你还必须确定你的dll是否作为一个并排组件。
旧时的内存,然后是当前目录,然后路径很容易理解。我认为Linux使用这种方法。