我有一个相当大的遗留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?
答案 0 :(得分:2)
有没有办法构建Win32库,以便它可以被C#/ .Net项目引用,以便我可以使用P / Invoke?
如果您想直接引用库,则需要使用库构建C ++ / CLI项目,并制作托管包装器。
如果你想使用P / Invoke(这是一个单独的概念),你可以使用C API进行导出,并通过P / Invoke直接调用它们。
这两种方法都是有效的,但在本机方面的实现(C ++ / CLI与C API包装器)方面完全不同,并且使用方式不同(直接引用C ++ / CLI与P / Invoke通过[DllImport]
)。
答案 1 :(得分:0)
您可以使用SWIG为代码生成包装器。 SWIG是一个非常强大的工具,值得花时间学习。它为包括Python,C#和Java在内的多种语言创建包装器,因此如果您使用一种语言,它也很容易在其他语言中使用。它将为您生成所有包装器代码,尽管您可能需要使用类型进行一些工作。您可以使用swig创建SWIG为其生成代码的特殊DLL,然后使用提供的C#代码访问DLL,而无需处理托管的C ++程序集,这可能是一个噩梦。
http://www.swig.org/Doc2.0/SWIGDocumentation.html
编辑:我的解释可能不那么明确,而且文档非常庞大,请看看“什么是swig?”这里开始的部分:
http://www.swig.org/Doc2.0/SWIGDocumentation.html#Introduction_nn2