Что означает Вызов платформы (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).