Считается ли [ComImport] P / Invoke? - PullRequest
6 голосов
/ 18 января 2012

Что означает Вызов платформы (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 (F8383852-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 is bad», ComImport будет считаться «плохим»"как DllImport?

Что равно Invoke платформы (P / Invoke)?


Обновление : сMSDN:

Учебник по вызову платформы

Службы вызова платформы (PInvoke) позволяют управляемому коду вызывать неуправляемые функции, которые реализованы в DLL.

Существует два способа, которыми код C # может напрямую вызывать неуправляемый код:

Я думаю, что мог ответить на свой вопрос.


Это полтора года спустя.Теперь, когда никто не обращает внимания на вопрос, и никто не пользуется им, я могу сказать, что ответ, который я принял, неверен.P/Invoke это сокращение от Platform Invoke.Это механизм, в котором управляемый код, работающий внутри CLR, может вызывать неуправляемый собственный (т.е. платформенный) код.Это почти всегда делается путем вызова кода, который находится в нативной DLL.COM dll являются собственным кодом;они просто следуют строгой структуре, чтобы позволить различным компиляторам вызывать их.

И Платформа Invoke - это плохо.Он обходит всю сборку мусора и зависит от платформы (т.е. мой 32-битный процесс CLR не может загрузить 64-битную DLL, мое приложение, написанное для Android, не может работать в Windows, мое приложение, написанное для функциональности в Windows 8, не будет работать наWindows XP).

1 Ответ

7 голосов
/ 18 января 2012

Нет, они не одинаковы. P / Invoke (вызов платформы) всегда включает вызов собственных DLL-файлов напрямую с использованием функциональности CLR.«Собственные библиотеки DLL» означают любые библиотеки DLL, которые предоставляют функции extern "C".Управляемые библиотеки DLL не позволяют вам их выставлять;такая DLL обычно написана на C / C ++.Отдельная подпись P / Invoke в управляемом коде является атрибутом DllImport (или функцией extern в C #).Чтение страницы P / Invoke нигде не упоминает о COM.

Использование ComImport предназначено для создания пользовательской сборки взаимодействия (то есть чего-то, созданного вручную, а не PIA автоматическигенерируется TlbImp) и использует встроенную функциональность CLR, которая совершенно не зависит от функциональности P / Invoke и специфична для COM.

Сходство заключается в том, что оба эти метода используются для взаимодействия с неуправляемый код .Поддержка обоих встроена в CLR, и хотя теоретически можно было бы использовать API-интерфейс Windows для полного взаимодействия COM в управляемом коде вручную, нет смысла, когда .NET предоставляет вам структурное средство с точки зрения основного или пользовательского взаимодействиясборки, а также поддержка более низкого уровня в System.ComponentModel.

...