【发布时间】:2013-07-18 21:10:16
【问题描述】:
我有一个相当大的遗留 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?
【问题讨论】:
-
嗯,P/Invoke 应该适用于遵循 Win C 约定的任何标准 DLL .. 你不要添加引用(因为它不是 一个 .NET 程序集),而只是 use Platform Invoke specifying the DLL。现在,您可以创建一个 wrapper 或“互操作”.NET 库来进行这些 P/Invoke 调用并引用它。另一种选择是公开 COM,从中可以“自动生成”PIA。
-
只能使用托管库作为参考,非托管库只能使用P/Invoke。
-
如果我尝试直接使用 DLL,我会收到类似的错误。我认为他们没有在 nmake 项目中指定 Win C 约定。我会坚持使用包装库。谢谢!