首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们如何保护自己不让其他第三方安装与我们的名称相同的DLL到C:\WINDOWS中?

我们如何保护自己不让其他第三方安装与我们的名称相同的DLL到C:\WINDOWS中?
EN

Stack Overflow用户
提问于 2010-03-11 21:51:22
回答 4查看 466关注 0票数 8

我们的产品包括几个从开放源码构建到默认名称的文件中的DLL,由开放源码开发人员交付。我们非常小心地将文件安装到自己的目录中,并仔细地管理搜索路径(仅用于我们的进程),以使加载程序保持愉快。

另一个开发人员--一个高超的智力--认为在同一个默认DLL文件名下将自己的一些开源版本安装到C:\WINDOWS中会更容易。因此,当我们启动一个依赖于这些开源DLL的进程时,系统在我们的目录之前搜索C:\WINDOWS,并找到其他开发人员安装的DLL。当然,它们是不相容的。

到目前为止,我所想到的想法:

  • 重命名所有DLL以避免默认名称,这只会使更不可能遇到冲突。
  • 按全路径加载所有all,以便加载程序将它们的名称捕获到RAM中,下次请求时不会在其他地方搜索

由于种种原因,目前这两种选择都不可取。

我们还能做些什么来保护自己不受世界上卓越的智慧的影响呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-12 08:19:42

为了增加已经很好的答案,您还有几个选择:

此问题的首选解决方案(自Windows支持)是将dll转换为win32程序集(它们不一定是.NET,但有关创建具有强名称的win32程序集的文档非常轻,因此很容易混淆并认为这是一种仅使用.NET的技术)。

程序集比包含dll和包含assemblyIdentiy元素的assemblyIdentiy和程序集中每个dll的文件节点数的文件夹(具有程序集的名称)要复杂得多。

基于程序集的搜索工作,即使当dll是静态链接!

  • 最简单的选择是创建非版本程序集,并将它们存储在与.exe文件相同的文件夹中(假设所有的exe都在一个文件夹中)。

如果exe位于不同的文件夹中,则有两种访问共享程序集的方法:

  • 如果希望在Windows 7及更高版本上使用应用程序,则可以将程序集存储在专用备用位置。为每个exe创建一个app.exe.config文件,并将一个探测privatePath元素指向要存储程序集的公用文件夹。
  • 如果您可以要求管理访问来执行安装,那么您可以处理处理程序集强名称的可怕的糟糕文档(嗯,缺少文档),然后将程序集存储在WinSxS中。

如果不能,或者不想将dll捆绑成程序集,那么此页涵盖dll搜索顺序。

使用像SetDllDirectory这样的函数只会帮助在运行时动态加载dll(通过LoadLibrary)。

Dll搜索顺序过去是:

  1. 包含进程exe的目录。
  2. 当前目录
  3. 各种窗口文件夹
  4. 路径

您可能已经习惯了这一点-启动每个exe,将“当前”目录设置为包含OSS dll的文件夹。

随着SafeDllSearchMode的出现,现在的搜索顺序是:

  1. 包含进程exe的目录。
  2. 各种窗口文件夹
  3. 当前目录
  4. 路径

这意味着现在的控制比以往任何时候都少:( -它对“不受信任”c:\windows & System32文件夹的控制速度更快。

同样,如果初始dll是通过LoadLibrary加载的,并且它的依赖dll是问题所在,则带有LOAD_WITH_ALTERED_SEARCH_PATH标志的LoadLibraryEx将导致以下搜索顺序(假设您传递到LoadLibraryEx的完整路径):

  1. 传递给LoadLibraryEx的Dll路径的目录部分
  2. 各种窗口文件夹
  3. 当前目录
  4. 路径
票数 3
EN

Stack Overflow用户

发布于 2010-03-11 21:58:05

您只有两个选项:将DLL部署在与EXE相同的目录中(这是Windows首先查找的位置),或者使用清单并将DLL部署到Windows并行缓存中。我不认为后一种选择在开放源码世界中很常见,但是如果您想要在不同的应用程序之间共享DLL,这是唯一真正的解决方法。

票数 5
EN

Stack Overflow用户

发布于 2010-03-11 22:14:19

加载应用程序的目录通常是加载DLL时搜索的第一个目录。但是,您可以使用SetDllDirectory获取“备用搜索顺序”。在本例中,首先搜索指定给SetDllDirectory的目录。

也有一个SafeDllSearchMode在一定程度上影响了这一点。打开它将当前目录排除在搜索之外。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2428963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档