在非托管C++代码中使用C#属性
本文关键字:属性 代码 C++ | 更新日期: 2023-09-27 18:30:11
我们有一个主要用C#编写的大型项目(服务、多线程等)。然而,核心数字运算算法是用非托管C++编写的,以提高速度(OpenMP等)。
不幸的是,目前我们必须做大量的工作来在这两个世界之间交换数据。也就是说,我们必须在C++/CLI中为每个C++类编写包装类。对于C#-"世界"中(实际上)任何必需的设置(Properties),C++世界中都有一个副本(头文件),包装类中有一个显式的来回转换。这种体系结构看起来效率很低,而且很容易出错。
主要问题:有没有一种方法可以在非托管C++中自动与属性共享C#类?(我们必须读写!)
次要问题:在上述情况下,您能就如何改进体系结构给出任何建议吗。我们的一个考虑因素是完全切换到C++,但现在必须为我们在.NET中所做的所有(系统)事情找到合适的库并编写干净的代码,这感觉不太好。
非常感谢您的帮助和问候,Jakob
我在工作中遇到了类似的问题,我的主要任务是为某些高性能、低延迟的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关键字。我必须处理高性能代码,所以在某些情况下,经过分析,我知道哪种是最好的解决方案。无论是您提到的warpper类解决方案,还是经典的COM方式,或者某种具有缓存、对象池等功能的混合。
希望能有所帮助。:)
如果这看起来有点杂乱无章,请道歉。这里已经很晚了