围绕非托管C ++的C#包装器

时间:2011-11-11 17:12:56

标签: c# c++ wrapper

我看到这里提出了类似的问题,关于用C#包装非托管C ++,但它们似乎都是关于具体的实现问题。我想知道使用C#和非托管C ++时的一般方法是什么。

例如,我有很多用非托管C ++编写的类,我希望能够通过.NET使用(理想情况下使用Excel中的VBA)。到目前为止,我一直在使用托管C ++ / CLI来做到这一点,但是我注意到了一些我不愿意避免的语言的奇怪之处。进一步阅读似乎我可以将我的非托管C ++包装在C#中,然后直接访问.NET(同时完全避免托管C ++ / CLI)。这是可能的,如果是这样,最好的方法是什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您有三种选择:

  • 使用C ++ / CLI包装器。如果您的目标是.NET,这是理想的解决方案。您可以从.NET世界访问所有内容。您可以用它包装C ++库,然后从C#/ whatever使用它。
  • Ditch .NET,并在ATL的帮助下制作COM包装器。这有点困难,但您可以从VBA / Excel更轻松地调用代码。如果需要,您仍然可以从.NET调用COM类。
  • 将您的代码编译为本机DLL,并使用C#中的P / Invoke。请注意,这个解决方案充其量是乏味的,因为没有什么是自动的。

如果您的目标确实是Excel / VBA,那么无论如何您都要创建COM对象,我将使用选项2并使用ATL直接创建COM类。这完全绕过了.NET,但是使用.NET来连接C ++代码和Excel之间的连接对我来说一直很麻烦。

答案 1 :(得分:1)

如果您想完全避免使用C ++ / CLI并使用纯C#来访问本机代码,则必须通过直接P / Invoke方法逐个方法。如果您有大量非托管代码,这几乎肯定不理想。

就我个人而言,我认为“最佳”解决方案是继续使用C ++ / CLI围绕您的本机代码编写托管包装器,以暴露最简单的公共接口以降低复杂性。