Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 什么是C++/是否需要CLI?_.net_C++ Cli - Fatal编程技术网

.net 什么是C++/是否需要CLI?

.net 什么是C++/是否需要CLI?,.net,c++-cli,.net,C++ Cli,是否有任何任务需要您使用C++/CLI,并且不能在托管代码中完成(使用p/Invoke和Marshal类),除了性能之外?首先,C++/CLI是托管代码 虽然您可以将C#/VB.NET与p/Invoke结合使用来完成在C++/CLI中可以完成的大部分工作,但C++/CLI只是使托管代码和非托管代码更容易在一个地方混合使用。例如,与必须重复C语言中的声明以及必须计算如何排列每个参数和返回值相比,更容易包括Windows .h或任何其他C++ API。 在使用库或任何使用C++类的代码的情况下,也需

是否有任何任务需要您使用C++/CLI,并且不能在托管代码中完成(使用p/Invoke和
Marshal
类),除了性能之外?

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

虽然您可以将C#/VB.NET与p/Invoke结合使用来完成在C++/CLI中可以完成的大部分工作,但C++/CLI只是使托管代码和非托管代码更容易在一个地方混合使用。例如,与必须重复C语言中的声明以及必须计算如何排列每个参数和返回值相比,更容易包括Windows .h或任何其他C++ API。 在使用库或任何使用C++类的代码的情况下,也需要这样做,因为由于名称的篡改和其他问题,无法调用这些代码。这是目前C++最常用的一种方法:在C++与C/2/ VB.NET之间的互操作。

< P>当然,当需要与用C++编写的库互操作时,需要C++或CLI。PunKee和MalHAL都不能处理具有实例函数的模板或C++类。或任何函数,将标准C++库对象作为一个参数,如STD::String,STD::vector,EtcTea.或者使用异常报告错误

而且可能需要使用一个界面笨拙的C库。一种摸索内存管理的方法,例如要求调用者释放内存。或者使用非常复杂的结构,这些结构很难在托管代码中重现


com互操作可以是一种替代方案,但是当它最初不是编写支持COM客户端时,它需要对C++库进行相当大的更改。使用C++ + CLI要简单得多。

我们公司有一个巨大的通信基础设施,完全是用C++语言开发的,C++代码和新的C语言组件都使用。我发现C++/CLI是一个非常有用的工具,可以将遗留组件与.NET世界连接起来。但是,我不想在C++中使用一个新的项目,因为它指出了Win32是一个C API(可以调用p/inCKE,尽管C++ +CLI使它更容易)与ValueC++的API(类、模板、重载的名字、虚拟函数表中的名字甚至没有导出,等等)。如果你需要注意的是,你需要调用内存,而不是直接调用,那么你可能需要C++的C++/WEELY知识,但不能用实例指针调用实例函数作为第一个参数(可能还有这个调用)。只有C++编译器才能计算出这个值的正确值。C++对多重继承的支持是最好的随机化工具。你可能已经尝试过了,但仍然不能解决正确调用构造函数和析构函数的问题,也不能正确地为对象分配和释放内存。嗯,这太荒谬了,外部“C”是你不需要的。最好不要使用,当函数更改时,损坏的名称会可靠地导致绑定错误,这是一个极好的诊断。