有没有办法从c头自动创建.net的p / invoke包装?
当然我可以手工创建它们,但是维护它们会很痛苦,而且我可能会在某处犯错,导致很难调试崩溃。
我尝试过SWIG,但它创建了完整的类,其中简单的结构就足够了。 SWIG的另一个问题是它需要在c侧添加额外的互操作代码。
我更喜欢输出也适用于单声道,但这不是必需的。
我可以处理的另一件事是一个解析c头的程序,并以一个漂亮的中间格式(如xml)创建一个输出,我可以自己创建C#包装器。
修改:
我需要PInvoke Interop助手。
但是它有一些小问题:
*它将“unsigned char *”转换为我更喜欢IntPtr的字符串
*它假设size_t = int = long = 32bit。这对我来说是正确的,但在每个平台上可能都不是这样
有没有一个干净的方法来解决这个问题?否则我会在转换之前在c代码上使用一些查找和替换。
答案 0 :(得分:10)
PInvoke Interop Assistant应该更适合您,它专门用于处理C代码。
请注意,没有工具可以为您提供100%保证的解决方案,C声明方式太模糊,无法保证完全无故障的结果。由指针引起的麻烦,在C代码中无处不在。没有办法告诉指针用于读取或写入内存。或两者。或谁负责释放正在指向的内存。
这也是静态代码分析器的一个主要问题,如果他们不知道如何使用指针,他们就无法做得不错。他们只能从使用中推断它,但这是一个鸡和蛋的问题,使用可能是错误的。 Microsoft使用SAL annotations在自己的头文件中解决了这个问题,这个额外的标记对编译器来说是中立的,但可以由代码分析器解析。他们明确说明了指针的用途。
Pinvoke Interop助手也使用它,这就是为什么它可以在winapi声明上做得更好。但这当然只适用于Microsoft头文件,这些SAL注释通常在繁忙的C程序员编写的代码中缺失。
答案 1 :(得分:1)
如果我理解你的问题,你基本上会问是否有办法去做SWIG的工作。
当然,您希望以不同的方式执行此操作,因此可以采用SWIG代码并将其更改为您希望的方式。