2012-04-04 143 views
5

使用C#性能我们有一个大的项目主要是写在C#(服务,多线程等)。但是,核心数字运算算法是用非托管C++写成的(OpenMP等)。在非托管C++代码

不幸的是,目前我们要做很多的努力来交换这两个世界之间的数据。也就是说,我们必须为每个C++类在C++/CLI中编写包装类。对于(几乎)在C# - “world”中的任何必需设置(属性),C++世界中存在一个副本(头文件),并在包装​​类中来回显式转换。这种体系结构看起来非常低效且相当容易出错。

主要问题: 有没有办法在非托管C++中以某种方式自动共享C#类的属性? (我们必须读写!)

第二个问题: 您是否可以就上述情况提供如何改善架构的建议。我们的一个考虑是完全切换到C++,但必须找到合适的库并为我们在.NET中执行的所有(系统)事情编写干净的代码,这一点感觉不好。

您的帮助和问候, 雅各布非常感谢

+0

您是否已经验证,在C#编写的算法是一个瓶颈? C#4.0现在对并行开发有很好的支持。 – Nick 2012-04-04 13:25:43

+0

不,我们还没有这样做,你说得对:我们应该尝试确保这一点。但是由于我们依赖于内存缓存等特殊属性,我真的怀疑算法会在CLR中以相似的速度运行。 – 2012-04-04 13:32:31

+2

[Protocol Buffers](http://code.google.com/p/protobuf/)怎么样?有能力与c#一起使用[protobuf-net](http://code.google.com/p/protobuf-net/)。 – megabyte1024 2012-04-04 13:35:04

回答

1

我处理我的工作类似的问题在我的首要任务是编写托管接口,某些高perfromance,低延迟的dll,这涉及到简单的情况下,其中I必须包装使用简单的C++含有原始指针到本机类或更复杂的问题,其中所述本机代码是一个服务器端发布者和托管代码具有订阅使用委托到/ CLI中的本地类,即它们必须是转换为本地回调。据我所知,底层.NET是一个复杂的COM服务器。可以使用将ComVisible属性设置为true编写.net程序集,然后将其作为传统的COM组件,然后可以将其从本地C++代码用作COM组件。使用DllImport属性可以实现使用本机代码的相反方式,并且可以通过各种属性(如StructLayoutAttribute(http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx)和MarshalAsAttribute(http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx) )对所有Marshaling进行微调,我也有时使用不安全的关键字以及。我必须处理高性能的代码,所以在某些情况下,在分析后我知道哪个是最好的解决方案。无论是你刚才提到的warpper级的解决方案或传统的COM方式,或某种混合的一些缓存,对象池等

希望有所帮助。 :)

道歉,如果这看起来有点杂乱无章。这里很晚。 :)

+0

感谢您的回答 - 我已经使用Marhsal.StructToPtr和同伴清理了很多包装代码,并且希望通过在C#和本机C++世界中使用C++/CLI组件来实现更远... – 2012-04-16 20:17:07

+0

谢谢Jakob S. – ervinbosenbacher 2012-04-17 01:20:11