c#对非托管c++的包装

C# Wrapper Around Unmanaged C++

本文关键字:c++ 包装      更新时间:2023-10-16

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

例如,我有相当多的类写在非托管c++,我希望能够通过。net使用(理想情况下与Excel中的VBA)。到目前为止,我一直在使用托管c++/CLI来做到这一点,但是我注意到该语言的一些奇怪之处,我宁愿避免。再往下读,似乎我可以把我的非托管c++包装在c#中,然后直接访问。net(同时完全避免托管c++/CLI)。这可能吗?如果可能,最好的方法是什么?谢谢你的帮助。

你有三个选择:

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

如果你的目标是真正的Excel/VBA,因为你要做COM对象无论如何,我会选择选项2,直接使用ATL做COM类。虽然这完全绕过了。net,但是使用。net来连接c++代码和Excel对我来说一直是个麻烦。

如果你想完全避免c++/CLI而使用纯c#来访问你的本地代码,那么它将不得不通过直接p/Invoke,逐个方法。如果您有大量的非托管代码,这几乎肯定不是理想的。

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