将非托管C ++代码转换为C#

时间:2009-09-01 08:48:43

标签: c# c++

指向用于将非托管c ++转换为c#的工具/实用程序的任何人? 我尝试了http://www.pinvoke.net/网站,但我无法在此question上找到对此API AddUsersToEncryptedFile的引用。

4 个答案:

答案 0 :(得分:2)

一般情况下,确实很难,因为C ++提供的功能与C#不同: 模板,朋友,零终止字符串,非托管指针,COM等, 更不用说解析C ++是一项蠢事。

要做到这一点,你需要一个完整的C ++解析器,它具有名称和类型解析,一组关于如何将每个构造(有问题或无问题)转换为等效C#代码的想法,一种将这些想法编码为自动翻译步骤的方法,以及如何处理代码中不能很好转换的部分(通常是“手工修复”)的计划。

使用提供所有必需机器的DMS Software Reengineering Toolkit, 我的公司Semantic Designs实际上构建了这样一个工具,但从未使用它,对于想要将80K SLOC的C ++移动到C#的大客户而言。通过该项目的大约2/3,客户进行了一些鸟笼管理改组,新经理决定不进行省钱(工具本身也很好)。

答案 1 :(得分:2)

你可能会觉得这个故事很有趣:

Disclosing How C#-SQLite Was Ported to .NET

SQLite是一个C程序,但这里有一些很好的高级技巧。

答案 2 :(得分:1)

您是否需要声明该API?你可以使用一个名为PInvoke Interop Assistant的工具,但我个人更喜欢DIY方法。这并不难。

尝试以下定义

struct EFS_CERTIFICATE_BLOB
{
    public int dwCertEncodingType;
    public int cbData;
    public IntPtr pbData;
}

struct ENCRYPTION_CERTIFICATE
{
    public int cbTotalLength;
    public IntPtr pUserSid;
    public IntPtr pCertBlob;
}

struct ENCRYPTION_CERTIFICATE_LIST
{
    public int nUsers;
    public IntPtr pUsers;
}

[DllImport("advapi32.dll", CharSet=CharSet.Unicode)]
static extern uint AddUsersToEncryptedFile(string lpFileName, ref ENCRYPTION_CERTIFICATE_LIST pUsers);

答案 3 :(得分:1)

如果要将C ++代码移植到C#,那么您应该考虑将非托管C ++代码转换为C ++ / CLI。然后,您可以开始以更加可控的方式移植到C#(即,一次一个地移植到C#中 - 最好在您进行单元测试时)。

转换为C ++ / CLI的另一种方法是使用SWIG包装现有的非托管C ++代码,但使用此方法迁移将变得更加困难。