我们有一个大型项目,主要用C#编写(服务,多线程等)。但是,核心数字运算算法是用非托管C ++编写的,速度很快(OpenMP等)。
不幸的是,目前我们必须付出很多努力来在这两个世界之间交换数据。即,我们必须为每个C ++类用C ++ / CLI编写包装类。对于(虚拟)C#中的任何所需设置(属性) - “world”,在C ++世界中有一个副本(头文件),并在包装类中来回显式转换。这种架构看起来非常低效且容易出错。
主要问题: 有没有办法在非托管C ++中以某种方式自动共享具有属性的C#类? (我们必须阅读和写作!)
次要问题: 如上所述,您能否就如何改进架构提出任何建议?我们的一个考虑是完全切换到C ++,但是必须找到适当的库并为我们在.NET中所做的所有(系统)事情编写干净的代码并不是很好。
非常感谢您的帮助和最诚挚的问候, 雅各布
答案 0 :(得分:1)
我正在处理我工作中的类似问题,我的主要任务是将托管接口编写到某些高性能,低延迟的dll,这涉及到我必须使用包含raw的简单c ++ / cli包装本机类的简单情况指向本机类的指针或更复杂的问题,其中本机代码是服务器端发布者,托管代码必须使用委托订阅它,即它们必须转换为本机回调。 据我所知,引擎盖下的.NET是一个复杂的COM服务器。可以在ComVisible属性设置为true的情况下编写.net程序集,然后它充当经典COM组件,然后可以将其作为COM组件从本机C ++代码中使用。使用来自托管的本机代码的反向可以使用DllImport属性来实现,并且所有Marshaling都可以通过各种属性(例如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)进行微调。 我也有时使用unsafe关键字。我必须处理高性能代码,因此在某些情况下,在分析后我知道哪个是最佳解决方案。无论是你提到的warpper类解决方案还是经典的COM方式,还是某种带有缓存,对象池等的混合方式。
希望有所帮助。 :)
如果看起来有点混乱,请道歉。这里很晚。 :)