首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[ComImport]是否被认为是P/Invoke?

[ComImport]是否被认为是P/Invoke?
EN

Stack Overflow用户
提问于 2012-01-18 14:18:28
回答 1查看 3K关注 0票数 6

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

执行P/Invoke意味着什么?是调用外部dll吗?例如:

代码语言:javascript
复制
[DllImport("coredll.dll", SetLastError=true)]
private static extern bool SHGetSpecialFolderPath(
      int hwndOwner, 
      string lpszPath,
      ceFolders nFolder,
      bool fCreate);

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

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

[ComImport]呢?例如:

代码语言:javascript
复制
[System.Runtime.InteropServices.ComImport]
[Guid("F8383852-FCD3-11d1-A6B9-006097DF5BD4")]
public class ProgressDialog
{
}

注意事项:此COM类(F 8383852-FCD3-11d1-A6B9-006097DF5BD4)可在

代码语言:javascript
复制
HKEY_CLASSES_ROOT\CLSID\{F8383852-FCD3-11d1-A6B9-006097DF5BD4}
      (default)       %SystemRoot%\system32\shell32.dll
      ThreadingModel  Both

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

代码语言:javascript
复制
[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#代码可以直接调用非托管代码的方法有两种:

  • 直接调用从DLL导出的函数。
  • 调用COM对象上的接口方法(有关更多信息,请参见COM互操作第1部分: C#客户端教程)。

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

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

而平台调用是不好的。它绕过所有垃圾收集,并依赖于平台(即我的32位CLR进程无法加载64位dll,为Android编写的应用程序不能在Windows上工作,为Windows 8功能编写的应用程序在Windows XP上不能工作)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中的底层支持时,这是没有意义的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8911635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档