问题标签 [dllimport]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
118098 浏览

c++ - 从 C++ 调用 DLL 中的函数

我在 VS 2008 中有一个解决方案,其中包含 2 个项目。一个是用 C++ 编写的 DLL,另一个是从空白项目创建的简单 C++ 控制台应用程序。我想知道如何从应用程序调用 DLL 中的函数。

假设我从一个空白 C++ 项目开始,并且我想调用一个名为int IsolatedFunction(int someParam)

我怎么称呼它?

0 投票
2 回答
10629 浏览

c# - DllImport vs LoadLibrary,最好的方法是什么?

我通常在 c#.NET 中使用 Win32 API。但不要在一个应用程序中声明所有内容。有时通常使用 user32,有时使用 gdi32 ...我认为当我声明所有 api 函数时,那些使用大量内存。在 .NET 中使用 API 的最佳方式是什么?

0 投票
2 回答
2833 浏览

c# - 将 C# 类库导入 Visual C++

我有一个 C# 类库,其中包含需要与外部应用程序一起使用的方法。不幸的是,这个外部应用程序只支持 C/C++ 中的外部 API。

假设我在这个 C# 库中有一个 takeIntReturnDoubleArray 方法,它接受一个整数并返回一个双精度数组。我需要做的就是有一个 C++ 方法,它接受一个整数,调用 C# 库并将一个双精度数组返回给调用应用程序。

所以本质上,C++ 库只是充当 C# 包装器和外部应用程序之间的中介。

是否有捷径可寻?我是否必须在 C# 方面做一些特别的事情才能轻松地将其导入 C++?我看过一些关于使用#import 语句的讨论,但我真的不知道我在使用 C++ 时在做什么。

我应该在这里采取什么方法?

0 投票
5 回答
18091 浏览

c# - 将函数从 C++ dll 导出到 C# P/Invoke

我已经构建了一个我想从 C# 代码调用的 C++ dll。我可以调用一个函数,但是当 C# 代码尝试加载 dll 时,另一个会引发异常。

标题如下所示:

这会生成一个带有稍微混乱的导出表的 dll(foo = foo 在 name 字段中是什么意思?):

我的 P/Invoke 声明如下所示:

对 Install 的调用毫无例外地返回,但是当我调用 PPPConnect 时,我得到一个 MissingMethodException -“在 PInvoke DLL 'PPPManager.dll' 中找不到入口点 'PPPConnect'。”

我尝试从 Install 函数声明中删除 extern 和 declspec 指令,这样 PPPConnect 是唯一导出的函数,这仍然不允许我调用 PPPConnect。

我也尝试过按序号进行 DllImport;这给出了与按名称调用相同的结果 - 安装返回,但 PPPConnect 抛出异常“找不到入口点 '#2'...”。

互操作日志给出:

这远远超出了我的专业领域,因此欢迎任何建议或想法。

谢谢,保罗

编辑:事实证明这段代码确实有效;问题在于最新的 dll 没有传播到设备。哦!

0 投票
3 回答
5826 浏览

c++ - 将类从可执行文件导出到 dll

我需要在 DLL 中使用在可执行文件中定义的类(DLL 和可执行文件由同一个编译器编译)。但我不希望这个类定义的源代码对 DLL 可用,只有声明。

一种可能的方法是使所有必要的类方法成为virtual(以便 DLL 链接器不需要这些方法的定义)。这种方法的缺点:

  1. 我无法使用new(必须在可执行代码中创建附加函数)在 DLL 代码中创建导出类的对象。
  2. 我必须制作所有这些方法virtual,即使它们不需要这样做virtual

__declspec(dllexport)有一种方法可以使用 Microsoft 的存储类扩展属性将类从 DLL 导出到可执行文件。有没有办法使用相同的技术将类从可执行文件导出到 DLL?

我的旧 Borland C 6 编译器不允许我在构建可执行项目期间创建导入库。(所以,在编译 DLL 时,链接器会为所有导入的非虚拟类方法提供未解决的外部错误消息。)这是这个编译器的限制,还是我遗漏了一些重要的东西?

0 投票
3 回答
1048 浏览

c# - C#程序(进程)不会卸载

我有一个 C# 程序,它使用来自另一个程序集的类,并且这个类调用一个非托管 DLL 来进行一些处理。这是一个片段:

我遇到的问题是,如果我调用“Func”,我的主 C# 程序将不会卸载。当我在主窗体中调用 Close() 时,如果我在任务管理器中查看,该进程仍然存在。如果我删除对“Func”的调用,程序会很好地卸载。我已经做了一些测试,程序 Main 函数肯定会返回,所以我不确定这里发生了什么。

0 投票
2 回答
1678 浏览

asp.net - ASP.NET 上的 P/Invoke [DllImport]

我在使用 DLLImport 时遇到了一些并发问题,我有一个 Dll 提供了一些我需要通过网络发送的报告,所以我有这个:

在 Dll 端有很多变量和实例,然后返回报告的路径。

我现在拥有的代码对 PrintRep 的调用有一个锁定,它可以工作,但显然会使挂起的请求等待,有没有办法在没有锁定的情况下工作?因为如果我取出锁,我会收到几个“尝试在受保护的内存上写入”错误,并且 Dll 最终会挂起。

0 投票
9 回答
71688 浏览

c# - “无法在 dll 中找到名为 [function] 的入口点”(c++ 到 c# 类型转换)

我有一个来自第三方的 dll,它是用 C++ 编写的。以下是来自 dll 文档的一些信息:

描述:接收函数结果的数据结构。所有函数结果都将存储为 Unicode (UTF-8)。

方法:

输入:

此函数要识别的图像位置的完整路径

用于接收函数结果的数据对象。函数返回:成功则返回真,否则返回假。

我正在尝试从我的 C# 应用程序中调用 recoCHN_P_Name。为此,我想出了这段代码:

导入dll的代码:

调用函数的代码:

我得到的错误是““无法在 DLL 'cnOCRsdk.dll' 中找到名为 'recoCHN_P_Name' 的入口点。”我怀疑我在将类型从 C++ 转换为 C# 时出错。但是究竟在哪里……?

0 投票
3 回答
2999 浏览

.net - 具有不同入口点的 DllImport(不同项目中相同导入的不同 DLL)

作为我最近关于 .NET Compact Framework 调试的问题的后续,我目前正在尝试从 .NET Compact Framework 和 .NET Framework 应用程序中使用 OpenGL ES。我使用这个包装器,它是为 OpenGL ES 创建并从 libGLES_CM.dll 导入的。

为了使调试更容易,我创建了一个 .NET Framework 应用程序,使用相同的文件重新创建了 OpenGL ES 和 EGL 的导入项目(只是为桌面框架构建),为 DLL 名称创建了常量,以便它们将从 libGLESv2.dll 和Windows 上的 libEGL.dll 和 CF 上的 libGLES_CM.dll。DLL 来自 PowerVR OpenGL ES Emulation SDK(目标设备具有 PowerVR SGX)并且只是围绕真实 OpenGL 实现的 OpenGL ES 包装器。问题来了:

在包装器库中,OpenGL 函数位于两个静态类(gl 和 egl)中,并具有通常的名称,但没有 gl/egl 前缀,因此调用它们将egl.GetDisplay()代替egl.eglGetDisplay(). 它们是这样导入的:

这在 Compact Framework 上运行良好。根据_eglGetDisplay@4 _ _到 Dependency Walker。

我设法将下划线添加到桌面项目的函数名称中,但不是为 CF 项目,通过有条件地将字符串常量设置为空字符串或“_”,并将它和入口点名称连接起来,所以它看起来像这:

这里没问题。但是仍然找不到该函数,因为缺少@4(那到底是什么?)。如果我添加@4,这可行,但由于这里所有函数都有不同的值,我必须手动执行此操作,并且对于 CF 版本,这些数字可能不正确。奇怪的部分来了:

如果我只是不指定入口点,而是将函数命名为应该命名的函数,则导入工作正常!现在这很丑,因为有双重前缀(静态类名和函数名),尽管我可以通过为此添加一个包装器来解决这个问题。因为我不会严重依赖这些功能(只需要一个相当简单的 2D 引擎),这不会是一个问题,但它只是感觉不对。

为什么指定入口点时不起作用?我该怎么做才能让它像它应该的那样工作?

0 投票
5 回答
67090 浏览

c# - 将非托管 dll 嵌入托管 C# dll

我有一个使用 DLLImport 使用非托管 C++ dll 的托管 C# dll。一切都很好。但是,我想将该非托管 DLL 嵌入到我的托管 DLL 中,正如 Microsoft 在那里解释的那样:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx

所以我将非托管 dll 文件添加到我的托管 dll 项目中,将属性设置为“嵌入式资源”并将 DLLImport 修改为:

其中“Wrapper Engine”是我的托管 DLL 的程序集名称“Unmanaged Driver.dll”是非托管 DLL

当我跑步时,我得到:

访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

我从 MSDN 和http://blogs.msdn.com/suzcook/看到这应该是可能的......