3

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

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

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

4

2 回答 2

2

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

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

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

于 2012-05-18T10:26:54.773 回答
0

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

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

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

于 2012-05-18T08:55:57.953 回答