将一些C#代码转换为托管或C ++ / CLI代码

时间:2012-09-13 17:05:58

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

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

我想知道我是否可以将C#代码转换为C ++ / CLI代码。将.net程序集转换为C ++ / CLI可能是获取特定代码的更好主意。我看着反射器和它的插件CppCli。但是插件不再可用了。所以我正在寻找任何方法来实现自动化。我很感激任何建议。

2 个答案:

答案 0 :(得分:3)

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

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

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

那里有commercial tools可以做到这一点,但我认为你还是可以手工做好。

答案 1 :(得分:1)

您可能不必转换代码。

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

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

C#中还有unsafe关键字,它允许在C#代码文件的各个部分中使用C ++ - ish样式指针,并关闭数组边界检查。根据您的使用情况,这可能有问题,也可能无关紧要。

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