gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:29:31 25 4
gpt4 key购买 nike

什么是平台调用 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com