C # форматирование внешних параметров функции Dll - PullRequest
3 голосов
/ 08 апреля 2009

Мне еще не удалось найти хорошую ссылку на эту тему. В этом примере мы возьмем некоторый код 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" ... при условии, что это правильно?

Любая помощь в этом, ребята?

Ответы [ 3 ]

4 голосов
/ 08 апреля 2009

Мне еще не удалось найти хорошую ссылку на эту тему.

Вот, пожалуйста.

Как ни странно, сайт в данный момент не работает, но это очень хороший ресурс для выявления проблем. В то же время, вы можете использовать архив pinvoke.net в Archive.net на http://web.archive.org/web/20080202041852/http://www.pinvoke.net

0 голосов
/ 08 апреля 2009

В дополнение к сайту P / Invoke , Адам Натан * .NET и COM: полное руководство по взаимодействию что-то стоящее, чтобы добавить к вашей книжной полке, если у вас больше, чем просто интерес к взаимодействию .NET.

Кев

0 голосов
/ 08 апреля 2009

Это выглядит правильно. Первая часть вашего вопроса (касающаяся MarshalAs) говорит компилятору преобразовать управляемую переменную C # в PSTR. Маршалинг в среде .NET относится к передаче данных между управляемой и неуправляемой средой. Эти атрибуты (среди нескольких других) сообщают компилятору, как это сделать конкретно.

Вторая точка указывает, что она будет передавать указатель на структуру. Тип IntPtr в .NET - это управляемый тип, который используется для хранения определенного фрагмента памяти. В мире .NET указатели (как правило) не существуют, хотя все еще существуют ссылочные типы. Управление указателями и дескрипторами осуществляется для нас CLR. Структура IntPtr используется при маршалинге указателей на структуры данных или примитивные типы

...