【问题标题】:Converting some C# code to managed or C++/CLI code将一些 C# 代码转换为托管或 C++/CLI 代码
【发布时间】:2012-09-13 17:05:57
【问题描述】:

我有一个现有的 C# 应用程序。我想要的是为 c# 应用程序的某些部分编写本机代码以提高速度,而另一部分使用 C# 应用程序,另一部分使用 C++/CLI 为 C# 应用程序提供接口。所以对于后面的部分,我需要将 C# 代码转换为 C++/CLI。

我想知道是否可以将我的 C# 代码转换为 C++/CLI 代码。也许将 .net 程序集转换为 C++/CLI 是获取特定代码的更好主意。我研究了反射器及其插件 CppCli。但是插件不再可用。所以我正在寻找任何方法来自动化这个。如有任何建议,我将不胜感激。

【问题讨论】:

  • 为什么要这样做?一般来说,除了 CLI 中的互操作之外,您应该避免做任何事情。
  • 好吧,我已经为原型编写了 c# 代码,我们希望通过 c++ 应用程序提高它的速度。我想知道我是否可以自动化转换过程。
  • 您不会使用 C++/CLI 提高速度(或者至少不会显着)。您可以使用本机 C++ 提高速度,但您可能知道,这种转换并非易事。 (我们制作了一个 C# 到 C++ 的转换器,但即使有某种程度的自动转换,它也绝对不适合胆小的人。
  • 正如@DaveDoknjas 所说,C++/CLI 确实并不快。我确实有一个项目,我们通过与本机 C++ 互操作来提高速度,但工作量很大。
  • 请问为什么这个问题被否决了?没什么大不了的。只是想知道原因以备日后参考。

标签: c# c++ c++-cli reflector


【解决方案1】:

一般来说,C++/CLI 的运行时间与 C# 大致相同(两者都是托管的,并且可能会转换为相同的 IL)。如果您的应用程序的某个部分需要运行得更快,您可以编写一个 C++/CLI 层,以便您的 C# 应用程序可以与一些本机 C++ 互操作。如果您适当地编写本机 C++,这将更快。

编辑: 正如 Ben Voigt 所指出的,C++/CLI 可能比 C# 更优化,但仍然不如编写良好的原生 C++ 快,因为它仍然是受管理的。

如果您希望在 C++/CLI 中封装一些本机代码,那么转换工具可能无论如何都不会以有用的方式构建它。最好只手动编码互操作部分。

commercial tools 可以做到这一点,但我认为你最好还是手动做。

【讨论】:

  • 我就是这么做的。我正在编写本机 dll,但仍需要 C++/CLI 来连接我的 c# 应用程序。对于那个 C++/CLI 部分,我需要转换。也许我必须解释得更好。
  • 在某些情况下,C++/CLI 编译器生成的 IL 比 C# 编译器优化得多(C++ 团队编写优化器已经有很长时间了,并且掌握了很多技巧)。
【解决方案2】:

您可能不必转换代码。

link.exe 是 C++ 编译器工具的一部分,能够在同一程序集中包含 C++ 和 C# 代码。 C++ 位可以包含托管和非托管代码的混合。您首先必须使用 C# 编译器 (csc.exe) 的命令行开关将 C# 代码编译为 .netmodule,然后您可以使用 link.exe 将其编译为包含 C++ 代码的程序集。自从我创建一个混合语言程序集以来已经有一段时间了,如果细节不是 100%,我们深表歉意,但是搜索上述术语,您会找到一种方法。

我似乎记得关键部分是记住 C++ 编译器比其他编译器更先进,因此可以使用 C#/VB 网络模块,但反过来不行。我发现编译成单个程序集而不是一个程序集引用另一个程序集的优点是单个程序集的每个部分内的类型可以相互交叉引用。通过在两个单独的程序集之间进行引用,类型感知关系必须是分层的。

C# 中还有 unsafe 关键字,它允许在 C# 代码文件的部分中使用 C++ 风格的指针,并关闭数组边界检查。根据您的使用场景,这可能会或可能不重要。

就我个人而言,我发现在 C++ 编译器中运行一些计算密集型代码的速度比 C# 快 20 倍,在我使用 C++ 中可用的指针对其进行优化之后,这对我来说是值得的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2011-02-27
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多