3

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

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

4

2 回答 2

3

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

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

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

商业工具可以做到这一点,但我认为你最好还是用手做。

于 2012-09-13T17:16:25.407 回答
1

您可能不必转换代码。

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

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

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

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

于 2012-09-13T19:10:25.290 回答