2009-09-01 106 views

回答

2

一般来说,这是真的很难,因为C++提供了不同的功能比C#: 模板,朋友,零结尾的字符串,非托管指针,COM等, 更不用说解析C++是一个婊子一份工作。要做到这一点,您需要一个完整的C++解析器,其中包含名称和类型解析,一组关于如何将每个构造(有问题或不可能)转换为等效C#代码的想法, ,以及如何处理代码翻译不好的部分(通常是“手工修复”)。

使用DMS Software Reengineering Toolkit,它提供了所有必要的机械, 我公司,语义设计,实际制造这样的工具,但从未使用过它,对于大客户是想转移的C 800K SLOC++到C#。通过该项目的2/3左右,客户对鸟笼管理层进行了重新洗牌,新经理们决定不再继续省钱(该工具本身运行良好)。

+0

听起来很有趣:) – 2009-09-01 08:59:58

+0

结果代码的维护和习惯性如何?我花了一些时间在机器翻译的代码库中,我宁愿使用原始语言。如果“真正的程序员能够用任何语言编写FORTRAN”,那么FORTRAN的自动翻译肯定能很好地满足那个“目标”。 – AProgrammer 2009-09-01 09:48:35

+0

它很容易构建一个糟糕的翻译器:只需将各个语言运算符直接映射到目标语言,而不考虑上下文。虽然您必须映射语言结构,但您可以考虑帐户上下文(DMS能够从应用程序中收集事实并使用它们来控制每个点处生成的内容),并且可以对翻译结果进行后优化。这两种技术都使代码更易于维护。 – 2009-09-01 09:55:08

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); 
+0

@Mattias s - 完整的代码列表在此网站: http://msdn.microsoft.com/en-us/library/aa363765(VS.85).aspx – 2009-09-01 09:14:45

1

如果要移植的C++代码到C#,那么你或许应该考虑非托管C++代码转换为C++/CLI。然后,您可以开始以更受控制的方式移植到C#中(例如,一次只执行一个单元 - 理想情况下单元测试将随时进行)。

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