5

我们有一个主要用 C# 编写的大型项目(服务、多线程等)。但是,核心数字运算算法是用非托管 C++ 编写的,速度很快(OpenMP 等)。

不幸的是,目前我们必须做很多努力才能在这两个世界之间交换数据。即,我们必须在 C++/CLI 中为每个 C++ 类编写包装类。对于 C#-“世界”中的(实际上)任何必需的设置(属性),在 C++ 世界(头文件)中都有一个副本,并且在包装类中来回显式转换。这种架构看起来效率很低,而且很容易出错。

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

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

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

4

1 回答 1

1

我在工作中处理类似的问题,我的主要任务是为某些高性能、低延迟 dll 编写托管接口,这涉及一些简单的情况,我必须使用包含指向原始指针的简单 c++/cli 包装本机类本机类或更复杂的问题,其中本机代码是服务器端发布者并且托管代码必须使用委托订阅它,即它们必须转换为本机回调。据我所知,.NET 是一个复杂的 COM 服务器。可以编写 ComVisible 属性设置为 true 的 .net 程序集,然后它充当经典 COM 组件,然后可以从本机 C++ 代码中将其用作 COM 组件。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 方式,或者是某种具有缓存、对象池等的混合方式。

希望有帮助。:)

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

于 2012-04-05T21:59:24.743 回答