6

我是一名普通的 .NET 开发人员,旨在将 C++ 库集成到 .NET 项目中。我有一些想法,但由于我一般是 C++ 新手,所以我不知道我正在尝试使用的技术的局限性。C++ 项目本质上是一个快速的声音渲染器,它可以通过一系列不同的后处理技巧播放多轨音频文件。所有这一切都很酷,但考虑到我有一个想要集成的简单 .NET WinForms 应用程序,事情开始变得一团糟。

  1. 首先,C++ 项目没有 .NET 绑定或 ActiveX/COM 集成。它是一个普通的 'ol MS VC++ 9 项目。如果我要在我的 .NET 应用程序中使用该项目,我将不得不以某种方式与之交互,即创建类实例、设置属性、调用方法、编组数据进出等。

  2. 其次,它构建为作为独立的 Windows 应用程序运行,并使用 MS Windows API 管理自己的窗口。这很好,但不知何故,我需要.NET VM在后台运行,管理节目并运行我所有的 C# 代码。我不写 C++,所以我需要坚持使用 C# 来围绕这个库构建一个应用程序。

  3. 第三,无论我是否在与 C++ 库相同的进程中运行,我都需要一种方法来构建/接口/调试这两个独立的应用程序,就好像它们是一个一样。除了我为高性能数据操作编写了几个 C++ DLL 之外,我没有 C++ 编程背景。

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

  • 我可以完全编译这个库并将其放入 VC EXE,但是如何将我的.NET 代码共同编译到其中?或者,如何将 C++ 代码编译到 .NET EXE 中,使其在托管环境中运行?请注意,它不是为此而设计的,如果我试图改变太多,可能会出现行为不端。

  • 主要问题是与它的接口。如何公开一些要从 .NET 访问的 C++ 类?我确切地知道我需要哪些类,并且我只需要几十个类以及它们的相关方法/属性即可从 .NET 获得。我不介意在.NET 中手写包装类来帮助.NET VM 理解来回传输的字节的类结构。我希望我可以直接在托管环境中使用 C++ 对象,这样我的大部分代码都可以保留在 .NET 中。

  • 即使我将它作为一个独立的应用程序运行,我是否必须求助于套接字或其他东西来与它通信?这是绝对最坏的情况,我会做任何事情来避免这种情况。

感谢您提供任何帮助或指示,我希望我清楚自己和手头的任务,并且我的问题足够具体且可以回答。谢谢你的帮助!

编辑:如果我编写包装类或生成它们,我可以使用P/Invoke创建类实例并在它们上调用方法并让它们在后台运行本机 C++ 代码吗?此类 C++ 对象的内存将在哪里存储和管理?在 .NET 堆内部还是外部?

4

2 回答 2

3

选项1

如果您打算使用非托管 C++ 对象,最好在 C++/CLI 中编写一个托管包装器,该包装器与它所包装的类具有相同的接口,但具有一个托管构造函数和析构函数来清理非托管资源。在 C++/CLI 中,您可以创建非托管对象,就像您必须自己删除的 C++ 一样,或者您可以使用 gcnew 关键字创建托管对象。包装器面向 .NET 的一侧将采用托管对象。包装器面向本机的一面可以对您已经拥有的所有非托管数据类型进行操作。

例如,考虑非托管类Frobber。在 C++/CLI 中,您将创建一个名为的类,该类ManagedFrobber具有FrobberFrobber. 在ManagedFrobber构造函数中,您将创建您的私有Frobber实例。在ManagedFrobber析构函数中,您将删除您的私有Frobber实例。托管包装类中的每个方法都会简单地调用私有Frobber实例上的方法。

选项 2

如果您打算从 C++ 世界调用的所有函数都是 c 样式的函数(我猜是 C# 意义上的静态函数),那么 P/Invoke 可能是要走的路,因为这样您就不必担心所有的细微差别一个包装类。例如,如果您使用包装类将数组从托管世界传递到非托管世界,您必须担心将数组固定在适当的位置,这样它就不会在托管世界中被 .NET 运行时移动正在玩弄它。使用 P/Invoke 可以为您处理大部分细微差别。

于 2013-03-18T22:33:29.530 回答
3

您可以将托管 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 文章.NET Programming in Visual C++

于 2013-03-18T22:36:52.843 回答