如何使用C ++项目从.NET应用程序中?(How to use a C++ project fro

2019-08-17 17:28发布

我是个普通的.NET开发人员,旨在为C ++库集成到一个.NET项目。 我有一些想法,但因为我一般是新的C ++,我不知道的技术我想与之合作的限制。 C ++的项目本质上是一个快速的声音渲染,可以播放与一群不同的后处理技巧的多轨音频文件。 所有这一切都很酷,但考虑到我有一个简单的.NET WinForms应用程序我想与整合,事情开始显得凌乱。

  1. 首先,C ++项目没有.NET绑定或ActiveX / COM集成。 其纯“醇MS VC ++ 9项目。 如果我在我的.net应用程序与项目合作我会以某种方式为界面 ,即。 创建类实例,一组属性,调用方法,在编组数据进出等

  2. 其次,它的建成为一个独立的Windows应用程序运行和管理使用微软Windows API自己的Windows。 这是好的,但不知何故,我需要的.NET VM在后台运行 ,管理和展示运行我所有的C#代码。 我不写C ++,所以我需要用C#,坚持围绕打造这个LIB的应用程序。

  3. 第三,无论我是在同一个进程中C ++ lib或不运行,我需要一种方法来建立/接口/调试这2个独立的应用程序,就好像它们是一个。 我除了事实上,我已经写了几个C ++的高性能数据处理的DLL在C ++编程的背景。

所以,许多问题和不知道如何开始!

  • 我完全可以编译此lib和它进入一个VC EXE,但我怎么共同编译我的.NET代码成吗? 或替代,我怎么编译C ++代码到.NET EXE所以它的托管环境中运行? 请注意,它不是为这一点,如果我试图改变太多可能无法正常运作。

  • 主要的问题是它的接口 。 如何暴露从.NET访问一些C ++类? 我知道我需要到底是哪班,我就只需要与他们相关的方法/属性沿着几十类可从.NET。 我不介意手写包装类在.NET帮助.NET VM了解来回传输字节的阶级结构。 我希望我可以用C ++对象从托管环境中工作直接所以大部分我的代码可以留在.NET。

  • 即使我运行它作为一个独立的应用程序,我将不得不诉诸插座或东西与它沟通? 这是绝对的最坏的情况下,我会尽一切努力避免这一点。

任何帮助或指针赞赏,我希望我自己和我的手边清楚的任务,而我的问题是不够具体和交代。 谢谢你的帮助!

编辑:如果我写的包装类或生成它们,我可以使用的P / Invoke ,以在其上创建类的实例,并调用方法,并让他们在后台运行原生C ++代码? 哪里就会为这样的C ++对象的内存来存储和管理? 在该.NET堆或外面呢?

Answer 1:

你可以写C ++(C ++ / CLI)包装托管到非托管C ++代码。 这将是最灵活的解决方案。 基本上,你在写C ++ .NET程序集,该集公开管理该打电话给你的非托管代码的类。 然后你可以从你的C#项目中引用这个组件。

有一个非常基本的文章该怎么做: http://www.windowsdevcenter.com/pub/a/dotnet/2004/03/29/mcpp_part3.html

这可能是有用的,以及: http://www.multicoreconsulting.co.uk/blog/c-snippets/how-to-call-unmanaged-cplusplus-from-csharp/

和MSDN文章在Visual C .NET编程++ 。



Answer 2:

选项1

如果你打算使用非托管C ++对象,它可能是更好的用C ++ / CLI托管的包装具有相同的接口,它的包装类,但有一个管理的构造函数和析构函数清理非托管资源。 在C ++ / CLI创建非托管对象,就像C ++,你必须自己删除,也可以创建管理与gcnew关键字的对象。 包装的.NET面对的将采取管理对象。 包装的本土面向侧可以在所有你已经拥有的非托管数据类型的操作。

例如,考虑非托管类Frobber 。 在C ++ / CLI中,你会创建一个名为类ManagedFrobber ,将有所有的相同的方法Frobber和包含的私有实例Frobber 。 在ManagedFrobber构造函数中,您将创建您的私人Frobber实例。 在ManagedFrobber析构函数,你会删除您的私人Frobber实例。 在托管包装类的每个方法会简单地调用私有方法Frobber实例。

选项2

如果你打算从C ++世界是C风格的功能(在C#意义上,我想静)调用,则P / Invoke的可能是要走,因为你不必担心所有的细微差别的方法包装类。 例如,如果您使用的包装类通过从托管世界的数组到不可控制的世界,你不必担心这样的事情钉住到位数组所以它不会同时管理世界各地的移动由.NET运行库是搞乱与它周围。 随着P /调用这些最细微之处都为您处理。



文章来源: How to use a C++ project from within a .NET application?