如何从流加载非托管DLL?

时间:2012-05-18 08:52:30

标签: .net vb.net pinvoke unmanaged

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

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

这有效,但是由于这个DLL来自数据库,我想知道是否可以通过流加载它,从而避免了将DLL存储在文件系统中某处的必要性。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

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