Как PInvoke такая структура / указать на структуру в C #? - PullRequest
0 голосов
/ 09 июня 2019

Мне дали DLL (очень старую), которая читает из своего рода "зашифрованный" (или, скорее, запутанный) файл данных и извлекает из него некоторые значения.Все, что я получил с ним, это те структуры и куча функций чтения, которые находятся внутри этой старой C ++ DLL.Это структуры:

typedef struct InParamsStruct {
    char *SourceFile;   // Path to a data source
    int DataIndex;      // Index of data inside a data source
} InParams;

typedef struct OutDataStruct {
    int Data1;      
    int Data2;      
    int Data3;      
} *OutData;

Пожалуйста, не этот второй typedef.Если я использую эту DLL в тестовом приложении C ++, это выглядит примерно так:

InParams inParams;

// here initialization of inParams

OutData outData = NULL;
outData = (OutData) malloc(sizeof(OutData));

// getting function handle from DLL here

retVal = GetData(inParams, outData);

// 1 = ok, 0 = error

В тестовом приложении C ++ retVal равно 1, и я получаю некоторые действительные данные в outData. Теперь мне нужно использовать эту DLL в C # (потому что все остальные библиотеки, которые я должен использовать, взяты из .NET, плюс приложение должно быть приложением с расширенным набором функций и т. д. и т. д.).поэтому я сделал это:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    struct InParams
    {
        public string SourceFile;
        public int DataIndex;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct OutData
    {
        public int Data1;
        public int Data2;
        public int Data2;
    }

    [DllImport("DataReader.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int GetData(InParams inParams, ref OutData outData);

Это не работает.Независимо от того, что я делаю, он всегда возвращает 0 (ошибка).Эта DLL написана так поразительно, что не дает никакой другой достоверной информации о причине ошибки (возможно, самой простой обработке исключений внутри).

Я попытался изменить ref на out.Подход с использованием пробных указателей (IntPtr, с полным выделением памяти).Также пробовал небезопасный код.Ничего не работает.

Больше всего меня удивляет то, что typedef в C ++ - для OutDataStruct.где новый тип на самом деле является указателем на структуру.Нужно ли что-то особенное на стороне C #?

Я знаю, что могу написать оболочку на C ++, но сейчас я пытаюсь избежать создания оболочки на оболочке, так как это может повлиять на производительность.

Спасибо за любую помощь.

Войтек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...