我有一些.dll原生C ++程序,主要返回int / double值,数组结构和字符串值。这些值应该由C#中的Web服务程序执行。
我想知道是否真的有必要修改我的C ++程序并适应Web服务,即将XML字符串/文件等值与XSD字符串/文件一起返回。我个人认为我不应该修改它们,因为我认为C#可以使用interop接收C ++值,并且可以使用.Net库的组件轻松序列化。
但是,我想收到关于将C ++值传递给Web服务的最佳,快速和有效方法的评论。
谢谢!
答案 0 :(得分:1)
我认为你可以照你所说的那样做 在过去,我通过在我的本机类中编写C ++ / CLI包装器并从C#中使用它们来实现相同或相似的功能。这并没有引起C#interop的开销,我注意到它可能非常昂贵。
答案 1 :(得分:0)
我认为P / Invoke就是你想要的。它允许您在托管代码和非托管代码之间传递简单和复合类型,并且您不必编写任何C ++ / CLI包装程序集。
This(MSDN)是P / Invoke的良好开端。如果向下滚动此处的部分名为“为用户定义的结构指定自定义封送”。这将允许您来回传递用户定义的结构。
查找MarshallAs,您可以看到所有可以编组的原始本机类型。 DllImport 属性也是您想要搜索的内容。
如果性能成为一个问题,我建议序列化/反序列化为命名管道或本地套接字,但我不完全清楚那里的性能特征。祝你好运!
答案 2 :(得分:0)
将C ++应用程序公开为Web服务的最佳,最快,最有效和最有效的方法是将C ++ Web服务代码置于其上。
请参阅GSoap了解一个非常快速的开源实现 - 一个3-5 times faster than the .NET and Java等效的实现。
答案 3 :(得分:0)
只要您可以将其返回给C#,C#应该能够从Web服务返回它。您根本不需要进行任何手动序列化。
答案 4 :(得分:0)
如果您选择进入序列化路线,您可能需要查看'thrift'(http://incubator.apache.org/thrift/)。
来自网站:
Thrift是一个软件框架 可扩展的跨语言服务 发展。它结合了一个软件 堆栈与代码生成引擎 构建有效工作的服务 并且在C ++,Java之间无缝地, Python,PHP,Ruby,Erlang,Perl, Haskell,C#,Cocoa,Smalltalk和 OCaml的。
最初在Facebook开发, Thrift于2007年4月开源 并进入了Apache孵化器 2008年5月。