需要 C++/CLI 做什么?

What is C++/CLI required for?

是否有任何任务需要您使用 C++/CLI 而不能在托管代码中完成(使用 P/Invoke 和 Marshal class),除了性能?

首先,C++/CLI 是托管代码。

虽然您可以使用 C#/VB.NET 和 P/Invoke 来完成您可以在 C++/CLI 中完成的大多数事情,但 C++/CLI 只是使将托管代码和非托管代码合二为一变得更加容易地方。例如,与必须在 C# 中重复声明并弄清楚如何编组每个参数和 return 值相比,包含 Windows.h 或任何其他 C++ API 更容易。

在您使用库或使用 C++ 的任何代码段的情况下也需要它 类,因为您不能 P/Invoke 由于名称修改和其他问题。这是当今 C++/CLI 最常见的用途之一:在本机 C++ 和 C#/VB.NET.

之间进行互操作

当然,当您需要与用本机 C++ 编写的库互操作时,需要 C++/CLI。 pinvoke 和 Marshal 都不能使用实例函数处理模板或 C++ 类。或者任何将标准 C++ 库对象作为参数的函数,如 std::string、std::vector 等。或者使用异常报错。

并且可能需要使用具有笨拙接口的 C 库。一种会搞乱内存管理,例如要求调用者释放内存。或者使用过于复杂的结构,难以在托管代码中重现。

COM interop 可能是一种替代方法,但是当 C++ 库最初并非为支持 COM 客户端而编写时,这需要对 C++ 库进行相当大的更改。使用 C++/CLI 更简单。