Мне дали 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 ++, но сейчас я пытаюсь избежать создания оболочки на оболочке, так как это может повлиять на производительность.
Спасибо за любую помощь.
Войтек