C# форматирование параметров внешней функции Dll
-
05-09-2019 - |
Вопрос
Я еще не нашел хорошей ссылки на эту тему.В этом примере мы возьмем код C++, который я пытаюсь перенести на C#.
На языке C++ у нас есть следующий прототип функции внешней библиотеки:
extern "C" DWORD EXPORT FILES_GetMemoryMapping(
PSTR pPathFile,
PWORD Size,
PSTR MapName,
PWORD PacketSize,
PMAPPING pMapping,
PBYTE PagesPerSector);
и в нем используется вот так:
FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector);
Теперь я пытаюсь перенести первую строку на C#, и здесь у меня нет четкого пути.
Это то, что у меня есть до сих пор:
[DllImport("Files.DLL")]
public static extern uint FILES_GetMemoryMapping(
[MarshalAs(UnmanagedType.LPStr)]
string pPathFile,
out ushort Size,
[MarshalAs(UnmanagedType.LPStr)]
string MapName,
out ushort PacketSize,
IntPtr pMapping,
out byte PagesPerSector);
Теперь вопрос:Есть ли какое-нибудь хорошее руководство, которое говорит мне, что "PSTR pPathFile" должно быть "[MarshalAs(UnmanagedType.LPStr)] string pPathFile"...Если предположить, что это правильно?
Или указатель на структуру «PMAPPING» становится «out IntPtr pMapping»…если предположить, что это правильно?
Любая помощь по этому поводу, ребята?
Решение
Я еще не нашел хорошей ссылки на эту тему
Как ни странно, сайт в данный момент недоступен, но это очень хороший ресурс для решения проблем.А пока вы можете использовать архив pinvoke.net на Archive.net по адресу: http://web.archive.org/web/20080202041852/http://www.pinvoke.net
Другие советы
Это выглядит правильно.Первая часть вашего вопроса (касающаяся MarshalAs) предписывает компилятору преобразовать управляемую переменную C# в PSTR.Маршалинг в среде .NET означает передачу данных между управляемой и неуправляемой средой.Эти атрибуты (среди некоторых других) сообщают компилятору, как конкретно это сделать.
Вторая точка указывает на то, что будет передан указатель на структуру.Тип IntPtr в .NET — это управляемый тип, который используется для хранения определенного фрагмента памяти.В мире .NET указателей (как правило) не существует, хотя ссылочные типы все еще существуют.Управление указателями и дескрипторами выполняется за нас CLR.Структура IntPtr используется при маршалинге указателей на структуры данных или примитивные типы.
В добавок к П/вызов сайт, Адам Натан's .NET и COM:Полное руководство по совместимости — это то, что стоит добавить на свою книжную полку, если у вас есть нечто большее, чем мимолетный интерес к взаимодействию .NET.
Кев