我们有一个大型项目,主要用C#编写(服务,多线程等).但是,核心数字运算算法是用非托管C++编写的,速度很快(OpenMP等).
不幸的是,目前我们必须做出很多努力来在这两个世界之间交换数据.即,我们必须在C++/CLI中为每个C++类编写包装类.对于(虚拟)C#中的任何所需设置(属性) - "world",在C++世界中有一个副本(头文件),并在包装类中来回显式转换.这种架构似乎非常低效且容易出错.
主要问题:有没有办法在非托管C++中以某种方式自动共享具有属性的C#类?(我们要读写!)
次要问题:如上所述,您能否就如何改进架构提出任何建议?我们的一个考虑是完全切换到C++,但是必须找到适当的库并为我们在.NET中所做的所有(系统)事情编写干净的代码并不是很好.
非常感谢你的帮助和最诚挚的问候,雅各布
我在工作中正在处理类似的问题,我的主要任务是将托管接口写入某些高性能、低延迟的 dll,这涉及到简单的情况,我必须使用简单的 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)我有时也使用 unsafe 关键字。我必须处理高性能代码,因此在某些情况下,经过分析后我才知道哪个是最佳解决方案。无论是您提到的扭曲类解决方案还是经典的 COM 方式,或者某种与缓存、对象池等混合的解决方案。
希望有帮助。:)
如果这看起来有点杂乱,我深表歉意。这里已经很晚了。:)
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |