是否可以从本地C ++重构代码位的选项?

时间:2020-03-06 14:51:32  来源:igfitidea点击:

因此,在谈到性能时,通常听到的一种评论是,我们可以使用任何语言编写代码以最快地完成工作。如果特定区域的性能有问题,请在C / C ++中重写这些位。

但是,如果我们从本机C ++应用程序开始怎么办?如果要使用Python,Ruby,C#等语言编写易用的位或者重构旧的位,我们有什么选择?请记住,在本机端和其他端之间传输数据是必须的。在将C ++类作为数据传递的同时,能够简单地调用用"更轻松"的语言编写的函数会很漂亮。

我们有一个坚固的Win32应用程序,如果我们可以在Cor内容中编写新代码或者重构旧代码,将会大有裨益。它很少需要C ++的复杂性,而处理那些琐碎的小东西却拖累了编程过程。

解决方案

如果我们想在C ++和Python之间工作,那么Boost Python就是我们想要的。我们可以手动为Cython编写C Python绑定,但这在许多方面限制了编写代码的方式。从本教程的一些片段中可以看出,这是最简单的方法:

一个简单的函数,它可以打个招呼世界:

char const* greet()
{
   return "hello, world";
}

需要将Boost python代码公开给python的代码:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

如何从python使用此代码:

>>> import hello_ext
>>> print hello.greet()
hello, world

朝相反的方向比较困难,因为python无法编译为本地代码。我们必须将python解释器嵌入到C ++应用程序中,但是此处记录了完成该操作所需的工作。这是调用python解释器并提取结果的示例(python解释器定义了用于C ++的对象类):

object result = eval("5 ** 2");
int five_squared = extract<int>(result);

好吧,这确实取决于语言。例如,使用Boost Python最容易完成Python接口,并且许多其他语言将要求我们像使用C一样使用它们进行接口,使用它们的C库并声明回调为外部" C"(不幸的是,我们可以通常不要使用其他语言的C ++类定义)。

但是我也想问一下,由于C ++是一种复杂的语言,因此我们打算将其用于什么用途,但是一旦我们熟悉了它,它就会非常强大,并且比其他语言更难编写代码。我能想到的唯一真正好的例外是,如果我们打算使用仅以一种语言存在的功能强大的库,并且没有不错的C ++替代方案(图形库可能是最好的例子,因为我们必须非常熟悉与他们一起有效地使用它们)。

还值得指出的是,如果将C ++代码与另一种语言接口,则会失去该语言所授予的跨平台兼容性。

在.NET世界中,我们始终可以选择为C#/ VB.NET程序集创建COM / ActiveX互操作层。

然后,我们可以使用C ++应用程序中的普通COM API来创建此COM服务器的实例,该实例实际上包装了.NET程序集。

这样做的好处是,简单的参数(例如int,bool,string,float等)已映射为它们的COM等效项。但是据我所知,不可能轻松地传递完整的.NET对象(我们创建的类的实例)。

另请注意,COM互操作调用相对较慢。我们不应该在紧密的循环中从C ++代码连续调用COM互操作方法。

传统上,COM / ActiveX依赖于Windows注册表,这并不理想,因为它是一个很大的依赖项。但是,也可以使用免注册COM互操作来避免这种依赖性。

本文介绍了为COM互操作注册.NET程序集所需的步骤。

我们可以将c ++项目中的公共语言运行时支持更改为/ clr。从这一点开始,我们可以直接在c ++代码中使用任何.net功能。这还包括在项目中创建Winform。我们还可以添加一个处理ui和其他功能的库。

正如Aaron Fischer所建议的那样,请尝试在打开/ clr选项的情况下重新编译C ++应用程序,然后开始利用.Net平台。

如果我们已经知道Cand C ++,就很容易使用CLI / C ++,并且它提供了.Net世界和本机C ++之间的桥梁。

如果我们当前的C ++代码无法在打开/ clr的情况下进行干净的编译,则建议我们尝试将应用程序构建为静态lib(未启用/ clr),然后将main()放在CLI / C ++项目中调用旧版应用程序入口点。这样,我们至少可以开始利用.Net来获得新功能。

有关已"移植"到.Net CLI / C ++的"旧版" C / C ++应用程序的示例,请查看Quake 2和Quake 3:竞技场的.Net端口。