Вопрос

Я должен передать InParameter из моего приложения на C # экспортированной функции из библиотеки DLL VC ++.Функция принимает 2 параметра :

int func_name (FILE* fp, BYTE& by);

fp находится В и by отсутствует параметр.

Я подумывал о маршалинге с использованием IntPtr для FILE* и используя byte для BYTE.Правильно ли это?Если я напишу следующее на C#

[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int      func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);

сработает ли это?Я думаю, что это выдаст ошибку для знака '&' в операторе маршалинга.Как мне передать параметр out по ссылке?

Мы были бы очень признательны за вашу помощь.

Спасибо, Вирен

Это было полезно?

Решение

Если собственная функция ожидает ссылку, вы можете маршалировать ее, используя ее ref / out .Так что в вашей ситуации вы могли бы использовать:out byte by.Я проверил это, и у меня это работает.

Отредактируйте еще раз: Мне только что пришло в голову, что советы, которые я вам дал, не сработают, поскольку FILE - это структура, которую вы не сможете так легко получить из c #.Итак, поцарапайте их, вы можете использовать этот подход, если вы будете использовать SafeFileHandle в качестве объекта HANDLE внутри вашей неуправляемой библиотеки.Если вы не можете изменить эту dll, одним из решений является создание собственной оболочки для создания файлов с использованием stdio, это может выглядеть следующим образом:

  1. Создайте библиотеку, которая предоставляет функциональность fopen, fclose и т.д.Фе.(на c++):
    FILE* CreateFile(char* name);
  2. Завершите эту функцию, в этом примере вы бы использовали (c #):
    public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
  3. Преобразуйте все параметры FILE * в IntPtr, а затем просто передайте результат функции CreateMyFile как ФАЙЛ*.

Другие советы

Нет, это не будет работать так, как написано.

  1. Где ты собираешься взять FILE* в программе на C #?Если какая-либо другая функция в вашей неуправляемой библиотеке dll не даст вам этот указатель, у вас проблемы.Кстати, я настоятельно рекомендую обернуть это FILE* в SafeHandle;тогда ваша подпись p / invoke будет использовать SafeFilePointer вместо голого IntPtr.
  2. Сколько байтов вы маршалируете?Если только один, поставьте out byte by в управляемой подписи (атрибуты не требуются).
  3. Вам не нужно указывать кодировку, поскольку вы не выполняете маршалинг каких-либо charы или strings.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top