我是一名普通的 .NET 开发人员,旨在将 C++ 库集成到 .NET 项目中。我有一些想法,但由于我一般是 C++ 新手,所以我不知道我正在尝试使用的技术的局限性。C++ 项目本质上是一个快速的声音渲染器,它可以通过一系列不同的后处理技巧播放多轨音频文件。所有这一切都很酷,但考虑到我有一个想要集成的简单 .NET WinForms 应用程序,事情开始变得一团糟。
首先,C++ 项目没有 .NET 绑定或 ActiveX/COM 集成。它是一个普通的 'ol MS VC++ 9 项目。如果我要在我的 .NET 应用程序中使用该项目,我将不得不以某种方式与之交互,即。创建类实例、设置属性、调用方法、编组数据进出等。
其次,它构建为作为独立的 Windows 应用程序运行,并使用 MS Windows API 管理自己的窗口。这很好,但不知何故,我需要.NET VM在后台运行,管理节目并运行我所有的 C# 代码。我不写 C++,所以我需要坚持使用 C# 来围绕这个库构建一个应用程序。
第三,无论我是否在与 C++ 库相同的进程中运行,我都需要一种方法来构建/接口/调试这两个独立的应用程序,就好像它们是一个一样。除了我为高性能数据操作编写了几个 C++ DLL 之外,我没有 C++ 编程背景。
所以,很多问题,不知道如何开始!
我可以完全编译这个库并将其放入 VC EXE,但是如何将我的.NET 代码共同编译到其中?或者,如何将 C++ 代码编译到 .NET EXE 中,使其在托管环境中运行?请注意,它不是为此而设计的,如果我试图改变太多,可能会出现行为不端。
主要问题是与它的接口。如何公开一些要从 .NET 访问的 C++ 类?我确切地知道我需要哪些类,并且我只需要几十个类以及它们的相关方法/属性即可从 .NET 获得。我不介意在.NET 中手写包装类来帮助.NET VM 理解来回传输的字节的类结构。我希望我可以直接在托管环境中使用 C++ 对象,这样我的大部分代码都可以保留在 .NET 中。
即使我将它作为一个独立的应用程序运行,我是否必须求助于套接字或其他东西来与它通信?这是绝对最坏的情况,我会做任何事情来避免这种情况。
感谢您提供任何帮助或指示,我希望我清楚自己和手头的任务,并且我的问题足够具体且可以回答。谢谢你的帮助!
编辑:如果我编写包装类或生成它们,我可以使用P/Invoke创建类实例并在它们上调用方法并让它们在后台运行本机 C++ 代码吗?此类 C++ 对象的内存将在哪里存储和管理?在 .NET 堆内部还是外部?