指向用于将非托管c ++转换为c#的工具/实用程序的任何人?
我尝试了http://www.pinvoke.net/网站,但我无法在此question上找到对此API AddUsersToEncryptedFile
的引用。
答案 0 :(得分:2)
一般情况下,确实很难,因为C ++提供的功能与C#不同: 模板,朋友,零终止字符串,非托管指针,COM等, 更不用说解析C ++是一项蠢事。
要做到这一点,你需要一个完整的C ++解析器,它具有名称和类型解析,一组关于如何将每个构造(有问题或无问题)转换为等效C#代码的想法,一种将这些想法编码为自动翻译步骤的方法,以及如何处理代码中不能很好转换的部分(通常是“手工修复”)的计划。
使用提供所有必需机器的DMS Software Reengineering Toolkit, 我的公司Semantic Designs实际上构建了这样一个工具,但从未使用它,对于想要将80K SLOC的C ++移动到C#的大客户而言。通过该项目的大约2/3,客户进行了一些鸟笼管理改组,新经理决定不进行省钱(工具本身也很好)。
答案 1 :(得分:2)
答案 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 ++代码,但使用此方法迁移将变得更加困难。