是否有任何要求您使用C ++ / CLI且无法在托管代码中完成的任务(使用P / Invoke和Marshal
类),性能除外?
答案 0 :(得分:5)
当您需要与使用本机C ++编写的库互操作时,当然,C ++ / CLI是必需的。 pinvoke和Marshal都不能使用实例函数来处理模板或C ++类。或者将标准C ++库对象作为参数的任何函数,如std :: string,std :: vector,etcetera。或使用例外报告错误。
可能需要使用具有笨拙界面的C库。一个笨拙的内存管理,要求调用者释放内存,例如。或者使用过于复杂的结构,这些结构太难以在托管代码中重现。
COM互操作可能是一种替代方案,但是当它最初编写为支持COM客户端时,需要对C ++库进行相当大的更改。使用C ++ / CLI要简单得多。
答案 1 :(得分:2)
首先,C ++ / CLI是托管代码。
虽然您可以将C#/ VB.NET与P / Invoke一起使用来完成您在C ++ / CLI中可以完成的大部分工作,但C ++ / CLI可以更轻松地在一个位置混合托管代码和非托管代码。例如,与不得不重复C#中的声明并且必须弄清楚如何编组每个参数并返回值相比,包含Windows.h或任何其他C ++ API更容易。
在您使用库或任何使用C ++类的代码的情况下也需要它,因为您可以通过名称修改和其他问题来调用/调用那些代码。这是当今C ++ / CLI最常见的用途之一:在本机C ++和C#/ VB.NET之间进行互操作。