- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
什么是平台调用 (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:
- Directly call a function exported from a DLL.
- Call an interface method on a COM object (for more information, see COM Interop Part 1: C# Client Tutorial).
我想我可能已经回答了我自己的问题。
一年半过去了。现在没有人关注这个问题,也没有人收藏它,我可以说我接受的答案是错误的。 P/Invoke
是 Platform 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/
我正在学习 com 并将其用于基于 .net 的应用程序。 我创建了一个简单的 MathFunction dll,它有一个函数 Add 2 numbers。 然后我使用 ComImport 将其加载到
我正在尝试将一些代码从 C# 转换为 F#,特别是创建快捷方式的代码,来自此处:http://vbaccelerator.com/home/NET/Code/Libraries/Shell_Proje
我正在尝试将一些代码从 C# 转换为 F#,特别是创建快捷方式的代码,来自此处:http://vbaccelerator.com/home/NET/Code/Libraries/Shell_Proje
我试图围绕平台调用服务、组件对象模型等概念进行思考,但我发现很难理解什么是什么以及不同职责所在的位置。我一直在研究包含以下内容的代码: [DllImport("shell32.dll", CharSe
什么是平台调用 (P/Invoke)? 执行 P/Invoke 是什么意思?是calling an external dll ?例如: [DllImport("coredll.dll", SetLas
我一直在尝试使用 ComImport 为我正在编写的 C# 应用程序在各种 dll 中设置一些与某些 win32 类的互操作。我不明白的是你如何找到一个类的 GUID?我找到了一些有效的导入示例,但我
我是一名优秀的程序员,十分优秀!