pInvoke和COM Interop有什么区别?

Gra*_*ant 17 .net com pinvoke

让我们说我正在访问第三方库,其文档声明我可以使用pInvoke或创建互操作库并使用COM.这两种技术有什么区别,为什么我可以选择其中一种?

Dea*_*ing 13

P/Invoke用于调用plain-C API(与大多数Win32 API一样).COM interop用于调用COM对象.

您可以围绕C API创建一个C++ COM包装器,然后使用COM interop来调用您的包装器,如果API调用的数量相对较高(并且您可以使用COM包装器将它们封装到一个或两个调用中).这是因为托管本机互操作可能相对昂贵,并且最小化转换次数是有益的.虽然实际上我会说使用C++/CLI来创建包装器可能对C#方面更友好一些(例如,看看SlimDX,它是围绕COM API(DirectX)的C++/CLI包装器).

话虽如此,除非你有一个特定的性能问题,否则我只想使用你想要调用的API更自然的方法:如果它是一个C API(如Win32 API那样),那么使用P/Invoke.如果它是基于COM的,那么使用COM互操作.

  • 不,COM互操作和P/Invoke是不同的,一个没有实现另一个.我在第二段中说的是,如果C API是"chatty"并且需要大量的函数调用,你可以创建一个COM包装器(在C++中)并从C#调用*wrapper*以减少托管数量 - 原生过渡.我怀疑这是您的图书馆的文档建议. (2认同)