Преобразование сигнатуры метода Delphi в c # - PullRequest
1 голос
/ 23 мая 2011

У меня есть эта подпись в функции delphi 2007, которую я вызываю (SomeOtherFile - это еще одна DLL, которую он в свою очередь вызывает):

function MyFunction(Place, Name: PChar):_Recordset; stdcall; far; external 'SomeOtherFile.DLL';

Я пытаюсь вызвать его из кода C # следующим образом:

[DllImport("MyFile.dll", CallingConvention = CallingConvention.StdCall,
    CharSet = CharSet.Ansi, EntryPoint="MyFunction")]

public static extern DataSet MyFunction(string Place, [MarshalAs(UnmanagedType.LPStr)]string Name);

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

1010 * редактировать * Фактическая ошибка: вызов функции PInvoke [...] разбалансировал стек ... Я также пробовал оба параметра, используя атрибут MarshalAs, и он выдает одно и то же.

1 Ответ

0 голосов
/ 23 мая 2011

Я немного покопался и думаю, что вам нужно маршалировать возвращаемое значение как Recordset интерфейс.Я уверен, что маршаллер P / Invoke не сможет магически преобразовать ваш Delphi _Recordset в экземпляр класса .net DataSet.

Так что я думаю, что вы можете написать что-то вроде этого:

[DllImport("MyFile.dll")]
[return: MarshalAs(UnmanagedType.Interface)]
public static extern object MyFunction(string Place, string Name);

Назовите это так

Recordset rs = (Recordset) MyFunction(Place, Name);

Я предполагаю, что параметры Place и Name являются входными параметрами, и в этом случае маршаллинг по умолчанию для строки вполне подходит.

Вам не нужно указывать набор символов ANSI, потому что это тоже по умолчанию.Вам не нужно называть точку входа, если она имеет то же имя, что и функция C #.Вам не нужно указывать соглашение о вызовах, потому что stdcall является значением по умолчанию.

Интерфейс Recordset находится в пространстве имен ADODB.

В сторонеиспользование far в импорте вашей функции Delphi является ложным.Ключевое слово far перестало действовать, как только мы оставили 16-битный мир позади.

...