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

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

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

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

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

【问题讨论】:

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

标签: c# .net


【解决方案1】:

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

来自 MSDN:

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

您的问题:

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

没有。

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

【讨论】:

  • 嗯,你已经回答了这个问题,但值得一提的是,有一种方法可以在 .net 中导入和使用 c++ 库
  • 同意,但通过间接方式
  • 是否足以包含相同的头文件,从库中为每个函数创建包装器然后编译它?
  • 也许,但我认为最简单的做法是在 EXPORTS 部分下列出 .DEF 文件中的每个函数。比克隆代码更容易
猜你喜欢
  • 2011-03-24
  • 2011-06-18
  • 1970-01-01
  • 2010-11-17
  • 2015-12-31
  • 2014-08-30
  • 2021-08-27
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多