我有一个用标准 C++ 编写的库。我还有一个用 C# 编写的 .Net windows 窗体应用程序,它利用了非托管库。
我知道我可以只使用 pinvoke,但我的 C++ 完全是面向对象的,我真的不想搞乱编组等。
有没有一种方法可以让我创建一个新的托管 C++ dll 项目,复制并粘贴我的头文件和代码文件,然后编译它并访问所有类?
或者我是否必须在托管 C++ 中创建一些 ref 类并将其连接到我的非托管类?我只是希望这尽可能简单。
谢谢!
即使在 C++/CLI 中,您仍然需要编写特定的 .NET 包装器,它们只是看起来不同。因此,您能否将其放入 C++/CLI 项目并重新编译并按原样使用它的答案是否定的。您仍然必须对数据进行编组(在这种情况下,您也可以使用 p/Invoke),或者您可以创建句柄并使用固定内存来使您的结构可用于托管代码。
我已经通过两种方式做到了这一点:我用 CUDA C 编写了一个 GPU 库,并使用 p/Invoke 从 F# 调用它,我用 C++ 编写了一个视频处理库并编写了一个瘦 C++/CLI 包装器,然后将其用于.NET 应用程序。我认为 CLI 包装器更痛苦,但对于实时视频,我需要更少的延迟(更少的复制内存)。对于 GPU 项目,我更关心吞吐量。
您可能想要在 C++/CLI 中编写包装类。只要您返回句柄而不是指针、枚举器而不是集合等,这样做相当简单。