[DllImport()] 可以处理静态 c 库吗

Posted

技术标签:

【中文标题】[DllImport()] 可以处理静态 c 库吗【英文标题】:Can [DllImport()] handle static c libraries 【发布时间】:2014-11-19 11:51:17 【问题描述】:

我可以导入带有 .lib 扩展名的静态 C 库吗?

我的头文件包含:extern "C" __declspec(dllexport)

我可以用P/Invoke助手从头源代码生成必要的代码,但问题仍然存在,

[DllImport()] 可以处理已编译的 C/C++ lib 文件吗?

【问题讨论】:

不,您必须将其编译为 DLL 并暴露函数。 这是否意味着我应该创建具有相同接口的本机包装项目,然后编译我自己的 dll,然后将其导入 C# 应用程序? 要么这样,要么直接使用 C++/CLI 创建托管接口(我会选择后者,工作量少) 【参考方案1】:

DllImport 通过引用模块 (.DLL) 导出表中定义的条目来工作。 .LIB 文件不是模块,也没有 .DLL 的导出表。

来自 MSDN:

DllImportAttribute 属性提供调用从非托管 DLL 导出的函数所需的信息。作为最低要求,您必须提供包含入口点的 DLL 的名称。 - Tell me more

您的问题:

[DllImport()] 可以处理静态 c 库吗?

没有。

但您始终可以将 .LIB 链接到 .DLL(假设您知道 c/c++)并 p 调用生成的 DLL,但这是一种间接解决方案,并不意味着 “是” 你的问题。

【讨论】:

嗯,你已经回答了这个问题,但值得一提的是,有一种方法可以在 .net 中导入和使用 c++ 库 同意,但通过间接方式 是否足以包含相同的头文件,从库中为每个函数创建包装器然后编译它? 也许,但我认为最简单的做法是在 EXPORTS 部分下列出 .DEF 文件中的每个函数。比克隆代码更容易

以上是关于[DllImport()] 可以处理静态 c 库吗的主要内容,如果未能解决你的问题,请参考以下文章

用C语言写的程序能调用C++写的静态库吗

我可以在自己的静态库项目中包含现有的静态库吗?

我们可以创建 Ghostscript 的静态库吗?

我可以让 gcc 链接器创建一个静态库吗?

除了静态库之外,我还可以使用“gcc -llibnamehere”绑定共享库吗?

iOS:我可以创建一个所有类(.h 和 .m)为公共的静态库吗?