什么是平台调用(P/ Invoke )?
执行P/Invoke意味着什么?是调用外部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类(F 8383852-FCD3-11d1-A6B9-006097DF5BD4)可在
HKEY_CLASSES_ROOT\CLSID\{F8383852-FCD3-11d1-A6B9-006097DF5BD4}
(default) %SystemRoot%\system32\shell32.dll
ThreadingModel Both我还可以用以下代码构造一个本机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:
平台调用教程 平台调用服务(PInvoke)允许托管代码调用在DLL中实现的非托管函数。 C#代码可以直接调用非托管代码的方法有两种:
我想我可能已经回答了我自己的问题。
一年半后。既然没有人注意这个问题,也没有人喜欢这个问题,我可以说我接受的答案是错误的。P/Invoke是Platform Invoke的缩写。它是一种机制,在CLR中运行的托管代码可以调用非托管本机(即平台)代码。这几乎总是通过调用驻留在本机dll中的代码来完成的。COM dll是本机代码;它们只是遵循严格的结构,允许许多不同的编译器调用它们。
而平台调用是不好的。它绕过所有垃圾收集,并依赖于平台(即我的32位CLR进程无法加载64位dll,为Android编写的应用程序不能在Windows上工作,为Windows 8功能编写的应用程序在Windows XP上不能工作)。
发布于 2012-01-18 14:27:49
不,他们不一样。P/调用 (platform )总是涉及直接使用CLR功能调用本机DLL。“本机DLL”指任何公开extern "C"函数的DLL。托管DLL不允许公开;这样的DLL通常是用C/C++编写的。托管代码中P/Invoke的分发签名是一个DllImport属性(或C#中的extern函数)。在任何地方读取P/Invoke页面都没有提到COM。
使用ComImport的目的是创建一个定制的互操作程序集(即手工构建的程序集,而不是由TlbImp自动生成的PIA ),并使用与P/Invoke功能完全独立并特定于COM的固有CLR功能。
相似之处在于,这两种方法都用于与非托管代码进行互操作。虽然理论上可以使用Windows在托管代码中完全手动地进行COM互操作,但是当.NET为您提供了一种结构手段(包括主互操作程序集或自定义互操作程序集)以及System.ComponentModel中的底层支持时,这是没有意义的。
https://stackoverflow.com/questions/8911635
复制相似问题