【问题标题】:How to load an unmanaged DLL from a stream?如何从流中加载非托管 DLL?
【发布时间】:2012-05-25 20:16:56
【问题描述】:

我有一个用 .NET 4.0 编写的应用程序,它需要在内存中加载本机 DLL(编写为 C)。

目前,我正在使用 P/Invoke 调用 LoadLibrary 传递 DLL 所在的路径。

这可行,但由于这个 DLL 来自数据库,我想知道是否可以通过流加载它,避免将 DLL 存储在文件系统中的某个位置。

【问题讨论】:

标签: .net vb.net pinvoke unmanaged


【解决方案1】:

Windows 不允许这样做,本机代码必须始终从磁盘上的文件加载。这是操作系统设计方式的核心,可执行文件通过内存映射文件映射到内存中。这需要一个文件。

它仅适用于纯托管代码 (Assembly.Load(byte[]),因为 IL 是数据,而不是本机代码。

避免将 DLL 存储在 dbase 中,您通常不能将它们写入磁盘,因为 UAC 或病毒扫描程序或 IT 人员对不知从何处出现的可执行文件非常不满意。它可以在您的开发机器上运行,但在用户机器上的几率很低。

【讨论】:

  • 该应用程序相当复杂,它被设计为在特定环境中工作。感谢您提供的信息,然后我将继续提取到文件系统。
  • 这是错误的。您可以从内存中加载 DLL,这称为手动映射。
  • Felix,你能解释一下怎么做吗?
【解决方案2】:

这是不可能的,因为您在 PInvoke 属性用法中指定了文件名。 PInvoke 需要一个静态已知的文件名。

如果无法静态确定文件名,则可能需要使用 LoadLibrary 和 GetProcAddress 调用 dll 中包含的函数。

或者您可以使用反射发射来动态发射 PInvoke 函数。

【讨论】:

  • 是否存在除 LoadLibrary 之外的其他 API,可用于从流中加载内存中的 DLL?
  • 不存在这样的 API。许多 Windows API 和可能的内核也希望加载的库基于内存映射文件。
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 2017-10-16
  • 2011-02-23
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多