我的整个应用程序(相当大,具有20MB可执行文件)用不受管理的C ++编写。因为我可以清楚地看到使用托管代码的优势,所以我想开始在应用程序中引入托管代码,但是我从哪里开始?

我可以轻松地开始使用C ++/CLI并将其与我的其余应用程序联系起来吗? (尽管C ++/CLI语法似乎“异国情调”)。

还是最好转到C#,但是将其与我的不受管理的C ++代码一起链接的最佳方法是什么?

使用 /CLR选项编译我所有的C ++代码是有意义的吗?这个可以吗?

我必须担心编组吗?这是否给人开销,还是可以在没有绩效惩罚的情况下进行管理和未经托管之间的切换(就像20年前混合Fortran和C时所做的那样)。性能在我的应用中确实很重要,因为这是一个科学应用,有时会处理几千兆的内存。

还是仅重新设计用户界面并将其写入C#并将其余的应用程序(计算逻辑,业务逻辑,数据库界面等)保留在不受管理的C ++中是有意义的吗?

由于我的应用程序有时需要处理几千兆字节的内存,因此我有一个64位变体。有64位托管代码容易吗?如果使用了很多内存,垃圾收集器仍然有效?

简单地说:我从哪里开始?

帕特里克

有帮助吗?

解决方案 3

目前,考虑这个问题关闭。

我意识到答案不是混合C ++和C#,而是首先要获得架构。

如果架构是正确的,并且将需要分开的位置分开,那么与其他模块(外部,其他语言,...)更改应用程序的一部分应该更容易。

关于编组过程中的性能问题,我们将不得不等到.NET进一步成熟。

其他提示

配置该应用程序,确定您可以在哪些集成点上摘下逻辑的C#行,然后分解为C ++,反之亦然。将它们安排成一个计划,以使外墙设计模式通过系统逐渐替换为C#。关键问题是决定在每个候选外墙 /接口上切换语言时的CPU和内存成本。

您将希望能够合并编辑,因此您最好使用原始C ++代码的一个源代码集和源代码存储库以及立面以及C#的另一个集合和存储库。

然后,随着增强功能/维护工作的出现,您将其应用于两个代码库,并尝试确保立面在系统中的移动,从最不可能更改增强或维护的代码开始,以最大程度地减少更改工作的加倍。 。

理想情况下,您可以构建您的工作,因此,如果您碰到障碍物,则可以在帽子下掉落时回滚,以返回100%C ++。

要测试是否可以将几个特别难以理解的C ++模块分成C ++件和C#件,请在两个不同的Win32 C ++过程中运行它们,这些过程使用管道或插座进行通信。这样一来,您就可以更好地了解需要进行内存管理还是需要修复的性能问题,然后才能将呼叫链分开。

我们完全按照您在任务关键应用程序中所描述的操作,该应用程序已被数千名用户使用。基本上,我们按原样保留了现有的应用程序,因此可执行文件仍然是100%无法管理的可执行文件(不是C ++/CLI)。然后,我们将所有新的C#代码放入.NET DLL中,其中包括业务对象,用户控件和GUI代码等。

基本上,所有新代码均以C#编写。我们有1个DLL,即C ++/CLI,只是胶水。这使我们可以轻松地在托管和未管理的代码之间进行互操作,而无需制作现有的C ++代码CLR。这限制了我们必须编写的C ++/CLI代码的数量。本机代码与混合模式代码进行了交谈,该代码可以与托管代码进行交谈。混合模式DLL可以在C#类上挂钩事件,因此C#代码只能触发事件以与C ++/CLI通信(可以与本机代码交谈)。

我们还可以在现有的C ++应用中托管.NET USERCONTROLS(无论如何,Winforms只是Winapi周围的包装器,因此它的运作良好)。

这效果很好,可以让您保留现有代码,而无需在C#中重写整个GUI。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top