如何在C#应用程序中创建可引用的Win32 DLL
本文关键字:可引用 Win32 DLL 创建 应用程序 | 更新日期: 2023-09-27 18:23:46
我有一个相当大的遗留nmake(Win32)项目,它从本机C++代码创建了一个静态库。我需要在C#/.Net应用程序中使用这个库。在过去,经过大量努力,我成功地将静态库封装在托管C++库中,然后我就可以在C#/.Net应用程序中引用它了。然而,在收到nmake项目开发人员的更新后,同时在我自己的构建机器上进行了多次升级,它不再工作。
然而,通过在构建属性中设置所有预处理器常量,我可以导入nmake项目的cpp和头文件,并将其构建到VS2010中的Win32静态库中。我将构建配置类型设置为DLL,然后尝试在我的C#/.Net应用程序中添加对Win32输出的引用,希望以后使用P/Invoke,但它失败了,并显示消息"无法添加对MyLibrary的引用"
有没有一种方法可以构建Win32库,使其可以被C#/.Net项目引用,并使我可以使用P/Invoke?
有没有一种方法可以构建Win32库,使其可以被C#/.Net项目引用,并使我可以使用p/Invoke?
如果您想直接引用库,则需要使用库构建一个C++/CLI项目,并制作托管包装器。
如果要使用p/Invoke(这是一个单独的概念),可以使用C API进行导出,并通过p/Invoke直接调用这些导出。
这两种方法都是有效的,但在本机端的实现(C++/CLI与C API包装器)方面完全不同,使用方式也不同(通过[DllImport]
直接引用C++/CLI和p/Invoke)。
您可以使用SWIG为代码生成包装器。SWIG是一个非常强大的工具,值得花时间学习。它为包括Python、C#和Java在内的多种语言创建包装器,因此,如果您使用一种语言,那么在其他语言中使用它也相当容易。它将为您生成所有的包装器代码,尽管您可能需要对类型进行一些处理。您可以使用swig创建一个特殊的DLL,swig为其生成代码,然后使用提供的C#代码访问DLL,而无需处理托管C++程序集,这可能是一场噩梦。
http://www.swig.org/Doc2.0/SWIGDocumentation.html
编辑:我的解释可能没有那么清楚,而且文档非常丰富,请查看此处的"什么是swig?"部分开始:
http://www.swig.org/Doc2.0/SWIGDocumentation.html#Introduction_nn2