如何使Win32 DLL在C#应用程序中可引用?

如何使Win32 DLL在C#应用程序中可引用?,c#,winapi,interop,C#,Winapi,Interop,我有一个相当大的遗留NFALE(Win32)项目,它从原生C++代码创建静态库。我需要在C#/.Net应用程序中使用此库。在过去的许多努力中,我成功地将静态库封装在托管C++库中,然后我可以在C·{/NET应用程序中引用它。然而,在收到nmake项目开发人员的更新后,同时在我自己的构建机器上进行了多次升级,它不再工作。 但是,我可以通过在build属性中设置所有预处理器常量,导入nmake项目的cpp和头文件,并将其构建到VS2010中的Win32静态库中。我将构建配置类型设置为DLL,然后尝

我有一个相当大的遗留NFALE(Win32)项目,它从原生C++代码创建静态库。我需要在C#/.Net应用程序中使用此库。在过去的许多努力中,我成功地将静态库封装在托管C++库中,然后我可以在C·{/NET应用程序中引用它。然而,在收到nmake项目开发人员的更新后,同时在我自己的构建机器上进行了多次升级,它不再工作。 但是,我可以通过在build属性中设置所有预处理器常量,导入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,该SWL生成代码,然后使用提供的C代码访问DLL,而不需要处理托管的C++程序集,这可能是一个噩梦要处理。

编辑:我的解释可能不太清楚,而且文档内容非常丰富,请查看此处的“什么是swig?”部分以开始:


Uhm,p/Invoke应该与遵循Win C约定的任何标准DLL一起工作。。您不添加引用(因为它不是.NET程序集),而只是添加。现在,您可以创建一个包装器或“interop”.NET库来进行这些P/Invoke调用,并引用它。另一个选项是公开COM,从COM可以“自动生成”PIA。您只能将托管库用作引用,并且只能对非托管库使用P/Invoke。如果我尝试直接使用DLL,则会出现类似错误。我认为他们没有在nmake项目中指定winc约定。我将坚持使用包装器库。谢谢