English 中文(简体)
P/Invoke或C++/CLI, 总结C图书馆
原标题:P/Invoke or C++/CLI for wrapping a C library

我们拥有一个温和的体积(40-奇功能),需要从C#项目中提用。 这些职能自然会中断,形成几个类别,包括提交项目其余部分的APIC。

是否有任何客观理由倾向于使用P/Invoke或C++/CLI,以防在APIC之下,从强力、可维持性、部署性、......?

我认为,这些问题可能是这样,但问题是:

  • C++/CLI will require a separate assembly; the P/Invoke classes can be in the main assembly. (We ve already got multiple assemblies, and there ll be the C DLLs anyway, so not a major issue.)
  • Performance doesn t seem to differ noticeably between the two methods.

我不肯定的是:

  • My feeling is C++/CLI will be easier to debug if there s an interop problem; is this true?
  • Language familiarity - enough people know C# and C++, but knowledge of details of C++/CLI are rarer here.

任何其他东西?

最佳回答

在我与现有C图书馆合作的情况下,我更喜欢PInvoke。 PInvoke,虽然有时是一片虚构的麻烦,但是一种相当了解的技术,拥有越来越多的工具和互联网文件。 总的来说,无论你遇到什么问题,网络上已经有一个样本,或快速检查 st流将提供解决办法。

C++/CLI是一种巨大的技术,但与PInvoke相比,IMHO的文献有限,无法预测具体情景。 该公司也没有利用PInvoke的通用解决方案基础设施。 把C++/CLI的组装成一个可以由PInvoke解决的情景,对我来说似乎过于昂贵。

另一方面,如果我与一个大型的C++图书馆合作,我就认为C++/CLI更是微不足道。 PInvoke没有与C++合作,我必须最终增加某种中间层。 无论是一个小的C级,还是一个C++/CLI图书馆,以填补这一空白。 C++/CLI认为,在这种情况下,我更自然。

问题回答

在很大程度上,这取决于如何处理记忆所有权。 P/invoke只有在记忆管理是两种特定方式之一时,才可能洗 mar点,通常由电离层的缓冲。 如果您的安普森回归点(通过回归价值或参数,确实是 t)并期望他们稍后再被交给销毁功能...... p/invoke要么做自动拆解,要么让你直接获得你后来从来必须的点值。 因此,C++/CLI在这种情况下成为一种非常可取的做法。

如果你有了解如何解冻C++的人员,C++/CLI就会更容易被解冻。 如果你不这样做,这可能会变得更困难。

我建议,这里的权衡是,方便消费者使用您的环形大会,而不是为大会本身提供可维持性。 如果你拥有熟悉C++并能够可靠地维持组装的高级工程师的坚实核心,那么在不熟悉本地法典的团队中,他们就会更容易获得一个完全管理的接口,照顾他们的一切。

另一方面,如果你重新担任唯一有C++经验的商店的人,我将把C++模块纳入该项目,如果其他人不得不在稍后时间维持这一模块。

对于这种规模的APIC(总切入点为40个),我将根据C#中你必须重复多少“头盔”来划定C++/CLI和P/Invoke之间的分界线。 如果其数额很小(略微),则P/Invoke罚款。 一开始重复许多工作。 H file in C# - especially for matters that aren t exposure in their . NET 2008年

Lots of good answers here - another perspective is the plan for the existing C API. Arguments for using PInvoke include:

  • You need to keep a C API around for compatibility with other C consumers
  • You need to keep the code in C as it s large and migration is too expensive

使用C++/CLI的标记包括:

  • you want to move as much of the code as possible to the CLR

在这种情况下,你可以先从C++/CLI开始,然后将更多人转移到C#





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签