如何最有效地在C和C#之间共享代码(Mono和Silverlight)

时间:2010-08-11 00:17:59

标签: c# c mono embedded cross-platform

我们的桌面应用程序包括一个Mono / .NET 3.5后端,通过USB与各种设备进行通信,以及一个通过插槽与后端通信的Silverlight前端。这些设备的固件是内部开发的。为了加快我们的开发过程并减少错误,我们希望在我们的固件和桌面应用程序之间共享代码。您建议我们使用哪些工具和技术来实现此目的?更好的是,您在软件中成功使用了什么来解决类似的问题?

我们要分享的两个主要内容是定义我们的通信协议的消息结构和当前通过C结构/数组常量定义的数据。对于协议消息,我们目前正在手动重写我们的消息实现类以匹配C定义,使用C代码作为指导。对于我们共享的数据,我们创建了一个托管C ++应用程序,该应用程序链接到已编译的C代码,然后将数组的内容提取到XML文件中。

我们的技术有效,但它们不是最佳的。首先,由于C代码并行改变和程序员错误,我们将C结构重新解释为C#有很多错误;我们希望在未来的开发中避免这类错误。对于数据共享,我对当前的解决方案没有太大的问题,但是提取程序的维护者说这是一个让它正常工作的痛苦过程。

我们对可以在设备固件上更改的内容有所限制。首先,我们有各种各样的处理器架构和嵌入式平台,因此C代码必须保持可移植性。另一方面,固件运行实时软件并受限于可用的MIPS和存储空间,因此我们无法添加任何具有不可预测或较慢执行时间的内容。

2 个答案:

答案 0 :(得分:2)

我会考虑使用XSLT转换来生成代码。有一个XML定义协议结构,并有各种XSLT生成C#和各种平台C代码。然后使用生成的代码构建应用程序。

XSLT转换可以成为项目构建的一部分,我在Using XSLT to generate Performance Counters code中描述的几个项目中使用了这种技术(尽管那篇文章不是关于comm协议,但实际上我在comm协议上使用了相同的技术,作为电线和模块之间)。一旦你克服了编写XSL和XQuery的困难,你就会变得非常高效,并且你会感激你可以轻松快速地改变通信协议。

答案 1 :(得分:2)

尝试协议缓冲区,这是一种二进制的,与编程语言无关的编码格式,Google将其用作其服务之间的数据交换格式。

您的想法是编写一个描述数据结构的.proto文件,并运行协议缓冲区编译器,为您的语言生成序列化/反序列化代码。这样可以更有效地在XML中进行编码并节省手动编写序列化器/反序列化器的时间并消除由于不正确实现而导致的错误(因为它们是在协议缓冲区的情况下从高级描述自动生成的)。

Google's implementation支持C ++,Java和Python,并且还有其他语言的独立实现,例如对于C#,有this onethis one

还有其他类似的技术,例如Facebook的节俭。