C# форматирование параметров внешней функции Dll

StackOverflow https://stackoverflow.com/questions/727942

  •  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.

Кев

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top