Лучший отвечающий
Функции c# и C++ обертки?

Вопрос
-
Извините за тупой, теоретический вопрос
В C# функции это обертки над низкоуровневыми Win 32 API(API)?
Например: MessageBox.Show над int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); и Registry.SetValue(keyName, "TestLong", 12345678901234, RegistryValueKind.QWord); над LSTATUS RegSetValueExA(HKEY hKey,LPCSTR lpValueName,DWORD Reserved,DWORD dwType,const BYTE *lpData,DWORD cbData);?
А C++ функции обернутые, напишите пример, а в заголовке Winreg.h функции это обертки над Win 32 API(API) или нет?
В c# все функции обертки? или какие то нет?напишите пример
В c++ напишите пример обернутых функций и своих
Не оскорбляйте пожалуйста и не флудите. Заранее спасибо7 февраля 2019 г. 15:46
Ответы
-
Начать с того, что MessageBox.Show в терминах C# - это не "функция". Функциями в C# обычно называют определенные типы делегатов (например Func<T,TResult>). Скорее всего, вы имели в виду "методы".
В C# функции это обертки над низкоуровневыми Win 32 API(API)?
Метод MessageBox.Show действительно является оберткой над функцией WinAPI, как и многие другие методы .NET. Но, разумеется, не все, например Path.GetFileNameWithoutExtension реализован полностью в управляемом коде.
А C++ функции обернутые, напишите пример, а в заголовке Winreg.h функции это обертки над Win 32 API(API) или нет?
В файле winreg.h не "обертки", а объявления функций из WinAPI, которые позволяют использовать их в приложениях на С++. Конечно, функции С++ также могут быть обертками над чем-то.
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 11 февраля 2019 г. 11:30
7 февраля 2019 г. 17:43
Все ответы
-
Начать с того, что MessageBox.Show в терминах C# - это не "функция". Функциями в C# обычно называют определенные типы делегатов (например Func<T,TResult>). Скорее всего, вы имели в виду "методы".
В C# функции это обертки над низкоуровневыми Win 32 API(API)?
Метод MessageBox.Show действительно является оберткой над функцией WinAPI, как и многие другие методы .NET. Но, разумеется, не все, например Path.GetFileNameWithoutExtension реализован полностью в управляемом коде.
А C++ функции обернутые, напишите пример, а в заголовке Winreg.h функции это обертки над Win 32 API(API) или нет?
В файле winreg.h не "обертки", а объявления функций из WinAPI, которые позволяют использовать их в приложениях на С++. Конечно, функции С++ также могут быть обертками над чем-то.
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 11 февраля 2019 г. 11:30
7 февраля 2019 г. 17:43 -
Метод MessageBox.Show действительно является оберткой над функцией WinAPI, как и многие другие методы .NET. Но, разумеется, не все, например Path.GetFileNameWithoutExtension реализован полностью в управляемом коде.
Path.GetFileNameWithoutExtension написана типа с нуля?
Я правильно понял?
В файле winreg.h не "обертки", а объявления функций из WinAPI, которые позволяют использовать их в приложениях на С++. Конечно, функции С++ также могут быть обертками над чем-то.
В winreg.h типа объявления функций WinAPI в не обернутом виде, а как чисто WinAPI, например MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); и ссылается на динамическую библиотеку в системе(вроде user32.dll)?
Я правильно понял?
и p/invoke это типа использования api?
- Изменено Аниме Любитель 7 февраля 2019 г. 21:57
7 февраля 2019 г. 21:33 -
В файле winreg.h не "обертки", а объявления функций из WinAPI, которые позволяют использовать их в приложениях на С++. Конечно, функции С++ также могут быть обертками над чем-то.
В winreg.h типа объявления функций WinAPI в не обернутом виде, а как чисто WinAPI, например MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); и ссылается на динамическую библиотеку в системе(вроде user32.dll)?
Я правильно понял?
<blockquote><p><span style="font-size:0.75em;">Метод MessageBox.Show действительно является оберткой над функцией WinAPI, как и многие другие методы .NET. Но, разумеется, не все, например Path.GetFileNameWithoutExtension реализован полностью в управляемом коде. </span><br /></p><p></p></blockquote>
Path.GetFileNameWithoutExtension написана типа с нуля?
Я правильно понял?
Значительная часть функционала .Net реализована в управляемом коде, например весь ADO.Net. Часть использует вызовы в родной код который является частью самого .Net Framework который по мере надобности вызывает API Win32. В других случаях может вызываться непосредственно код Win32, через P/Invoke или COM Interop.
Вы можете самостоятельно посмотреть что и как просто отлаживая код который вызывает нужные метод. Символы и исходники загрузятся если настроить как описано тут:
https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-debug-dotnet-framework-source?view=vs-2017
This posting is provided "AS IS" with no warranties, and confers no rights.
7 февраля 2019 г. 21:53Модератор -
"Я правильно понял?"
В целом правильно. Только объявления в заголовочных файлах С++ не ссылаются на конкретную DLL, а лишь описывают параметры функции и ее возвращаемое значение, а также указывают, что функция является внешней (т.е. что ее реализация находится в другом модуле). Ссылка на конкретную DLL задается уже путем передачи компоновщику библиотеки импорта для этой DLL (специального файла с расширением lib) через параметры командной строки или директивы #pragma, в случае Visual C++.
8 февраля 2019 г. 3:09 -
"Я правильно понял?"
В целом правильно. Только объявления в заголовочных файлах С++ не ссылаются на конкретную DLL, а лишь описывают параметры функции и ее возвращаемое значение, а также указывают, что функция является внешней (т.е. что ее реализация находится в другом модуле). Ссылка на конкретную DLL задается уже путем передачи компоновщику библиотеки импорта для этой DLL (специального файла с расширением lib) через параметры командной строки или директивы #pragma, в случае Visual C++.
В случае с DirectX например lib? вроде статическая линковка(или связывания), правильно?
А в случае MessageBox и на остальные динамические dll типа user32.dll, gdi.dll тоже статическая линковка(или связывания) и тоже есть lib или нет, если да то где lib в компиляторе?
Или там динамическое связывание(по dll)?
Ответе на все вопросы пожалуйста
8 февраля 2019 г. 10:08 -
Lib-файл может быть как статической библиотекой, так и библиотекой импорта для DLL. На практике, конечно, чаще всего используется динамическое связывание. Библиотеки импорта для библиотек Windows, вроде user32.dll, поставляются с Windows SDK, для DirectX - с DirectX SDK.
8 февраля 2019 г. 10:50 -
Lib-файл может быть как статической библиотекой, так и библиотекой импорта для DLL. На практике, конечно, чаще всего используется динамическое связывание. Библиотеки импорта для библиотек Windows, вроде user32.dll, поставляются с Windows SDK, для DirectX - с DirectX SDK.
- Изменено Аниме Любитель 8 февраля 2019 г. 10:55
8 февраля 2019 г. 10:55 -
С Visual Studio в комплекте идет урезанная версия Windows SDK, которая содержит lib-файлы. С другими IDE ситуация может быть разной, например, CodeBlocks содержит часть lib-файлов Windows SDK (которые, правда, переименованы в расширение .a, но суть от этого не меняется, это абсолютно те же файлы).8 февраля 2019 г. 14:19
-