c# - [ComImport] 是否被视为 P/Invoke?

标签 c# com pinvoke

什么是平台调用 (P/Invoke)?


执行 P/Invoke 是什么意思?是calling an external dll ?例如:

[DllImport("coredll.dll", SetLastError=true)]
private static extern bool SHGetSpecialFolderPath(
      int hwndOwner, 
      string lpszPath,
      ceFolders nFolder,
      bool fCreate);

这就是 P/Invoke 的意思:使用 [DllImport] 属性吗?

还有什么可以被认为是P/Invoke吗?

[ComImport] 怎么样?例如:

[System.Runtime.InteropServices.ComImport]
[Guid("F8383852-FCD3-11d1-A6B9-006097DF5BD4")]
public class ProgressDialog
{
}

注意:这个COM类(F8383852-FCD3-11d1-A6B9-006097DF5BD4)可以在

HKEY_CLASSES_ROOT\CLSID\{F8383852-FCD3-11d1-A6B9-006097DF5BD4}
      (default)       %SystemRoot%\system32\shell32.dll
      ThreadingModel  Both

我还可以使用以下代码构造一个 native ADO Recordset 对象:

[System.Runtime.InteropServices.ComImport]
[Guid("00000535-0000-0010-8000-00AA006D2EA4")]
public class Recordset
{
}

Object rs= new Recordset();

这算是 P/Invoke 吗?

如果我们选择说“P/Invoke 很糟糕”,那么 ComImport 是否和 DllImport 一样“糟糕”?

什么是平台调用 (P/Invoke)?


更新:来自 MSDN:

Platform Invoke Tutorial

Platform Invocation Services (PInvoke) allows managed code to call unmanaged functions that are implemented in a DLL.

There are two ways that C# code can directly call unmanaged code:

我想我可能已经回答了我自己的问题。


一年半过去了。现在没有人关注这个问题,也没有人收藏它,我可以说我接受的答案是错误的。 P/InvokePlatform Invoke 的缩写。它是一种机制,在这种机制中,在 CLR 内部运行的托管代码可以调用非托管 native (即平台)代码。这几乎总是通过调用驻留在 native dll 中的代码来完成的。 COM dll 本地代码;它们只是遵循严格的结构以允许许多不同的编译器调用它们。

Platform Invoke 很糟糕。它绕过所有垃圾收集,并且取决于平台(即我的 32 位 CLR 进程无法加载 64 位 dll,我为 Android 编写的应用程序无法在 Windows 上运行,我为 Windows 8 上的功能编写的应用程序无法在Windows XP)。

最佳答案

不,它们不一样。 P/Invoke (平台调用)始终涉及使用 CLR 功能直接调用 native DLL。 “ native DLL”是指任何公开 extern "C" 函数的 DLL。托管 DLL 不允许您公开它们;这样的 DLL 通常是用 C/C++ 编写的。托管代码中 P/Invoke 的赠品签名是 DllImport 属性(或 C# 中的 extern 函数)。阅读 P/Invoke 页面没有任何地方提到 COM。

使用 ComImport目的是创建自定义互操作程序集(即手工制作的东西,而不是 TlbImp 自动生成的 PIA),并使用完全独立于 P/Invoke 功能的固有 CLR 功能,并且特定于 COM。

相似之处在于这两种方法都用于与非托管代码 进行互操作。 CLR 内置了对两者的支持,虽然理论上可以使用 Windows API 在托管代码中完全手动执行 COM 互操作,但是当 .NET 为您提供一种结构方式时,就主要或自定义互操作而言,这毫无意义程序集以及 System.ComponentModel 中的低级别支持。

关于c# - [ComImport] 是否被视为 P/Invoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8911635/

相关文章:

c# - 方法的类型签名与 PInvoke 不兼容

c# - XAML 中列表的绑定(bind)列表?

c# - C#类是否知道实例化了哪个文件?

.net - Reg-Free COM 是否与互操作一起使用?

c# - 如果我通过 COM 接口(interface)更新正在运行的程序所使用的 DLL,会发生什么情况?

c# - C# 中的 C++ 非托管 DLL

c# - C# 中如何比较数组是否相等?

c# - Windows Aero 窗体错误

c++ - #import 导致 HRESULT 0x80040154 "Not registered class"

c# - 从 C# 调用 dll 中的 Delphi 方法