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