2

我有一个相当大的遗留 nmake (Win32) 项目,它从本机 C++ 代码创建一个静态库。我需要在 C#/.Net 应用程序中使用这个库。过去,经过大量努力,我成功地将静态库包装在托管 C++ 库中,然后我可以在 C#/.Net 应用程序中引用该库。但是,在收到 nmake 项目开发人员的更新后,同时在我自己的构建机器上进行了多次升级后,它不再工作了。

但是,通过在构建属性中设置所有预处理器常量,我可以导入 nmake 项目的 cpp 和头文件并将其构建到 VS 2010 中的 Win32 静态库。我将构建配置类型设置为 DLL,然后尝试在我的 C#/.Net 应用程序中添加对 Win32 输出的引用,希望以后可以使用 P/Invoke,但它失败并显示消息“无法引用 MyLibrary被添加。”

有没有办法构建 Win32 库,以便 C#/.Net 项目可以引用它,以便我可以使用 P/Invoke?

4

2 回答 2

2

有没有办法构建 Win32 库,以便 C#/.Net 项目可以引用它,以便我可以使用 P/Invoke?

如果您想直接引用该库,则需要使用您的库构建一个 C++/CLI 项目,并制作托管包装器。

如果您想使用 P/Invoke(这是一个单独的概念),您可以使用 C API 进行导出,并通过 P/Invoke 直接调用它们。

这两种方法都是有效的,但在本机端的实现(C++/CLI 与 C API 包装器)方面完全不同,并且使用方式也不同(直接通过 C++/CLI 与 P/Invoke 引用[DllImport])。

于 2013-07-18T21:15:52.413 回答
0

您可以使用 SWIG 为您的代码生成包装器。SWIG 是一个非常强大的工具,值得花时间学习。它为包括 Python、C# 和 Java 在内的多种语言创建包装器,因此如果您使用一种语言使用它,那么在其他语言中也很容易使用。它将为您生成所有包装器代码,尽管您可能需要对类型进行一些处理。您使用 swig 创建一个特殊的 DLL,SWIG 为其生成代码,然后使用提供的 C# 代码来访问 DLL,而无需处理托管 C++ 程序集,这可能是一场噩梦。

http://www.swig.org/Doc2.0/SWIGDocumentation.html

编辑:我的解释可能不是那么清楚,而且文档非常庞大,请查看“什么是痛饮?” 从这里开始:

http://www.swig.org/Doc2.0/SWIGDocumentation.html#Introduction_nn2

于 2013-07-18T21:23:15.723 回答