Уважаемые, вот столкнулся с такой проблемой: требуется на C# вызвать
функцию, реализованную в DLL, НО DLL написана на Delphi!!!
MSDN читал, MessageBox вызывать научился

Проблема IMHO в передаче параметров. Установлено опытным путем, что для
паскалевской функции
function Test(var a:integer) : integer;export;
begin
Result := a;
end;
при вызове ее так
[DllImport("mydll", CallingConvention = CallingConvention.StdCall)]
public static extern int Test(int a);
Результатом является всегда одно и тоже число, причем независипо от
CallingConvention и передачи параметра ref или [In, Out].
Но это все цветочки, а вот ягодки здесь: функция, которую надо вызвать такая:
function LInv(var n : integer; //размер динамических массивов
var dReIn : array of double;//динамический массив (вход)
var dImIn : array of double;//динамический массив (вход)
var dReOut : array of double;//динамический массив (выход)
var dImOut : array of double//динамический массив (выход)
) : integer;export;
Если не понятно, то Функция обрабатывает первые два массива и записывает значения
во вторые два массива. Результат функции — код ошибки. Если вызывать из
Delphi, то все работает отлично.
Подскажите, если кто сталкивался, как можно такую функцию на C# вызвать.
Я уже много всяких вариантов перепробовал,
осталось только исполнить танец с бубном вокруг компьютера — авось заработает.
(Переписать функцию не предлагать, это физически невозможно!)
Leonid, Dr-L@yandex.ru
Здравствуйте, DrL, Вы писали:
DrL>function Test(var a:integer) : integer;export;
DrL>[DllImport("mydll", CallingConvention = CallingConvention.StdCall)]
DrL> public static extern int Test(int a);
DrL>Результатом является всегда одно и тоже число, причем независипо от
DrL>CallingConvention и передачи параметра ref или [In, Out].
в шарпе int — 32 бита, а в паскале (если не ошибаюсь) 16 бит
поэтому думаю тебе надо вызывать
public static extern short Test(short a);
DrL> function LInv(var n : integer; //размер динамических массивов
DrL> var dReIn : array of double;//динамический массив (вход)
DrL> var dImIn : array of double;//динамический массив (вход)
DrL> var dReOut : array of double;//динамический массив (выход)
DrL> var dImOut : array of double//динамический массив (выход)
DrL> ) : integer;export;
а эту функцию надо объявлять так:
using System.Runtime.InteropServices;
...
static extern short LInv(short n,
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] double[] dRemIn,
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] double[] dImIn,
[Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] double[] dRemOut,
[Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] double[] dImOut)
... << RSDN@Home 1.1 beta 1 >>
Здравствуйте, DrL, Вы писали:
DrL>[DllImport("mydll", CallingConvention = CallingConvention.StdCall)]
А почему StdCall? По умолчанию в Дельфи FastCall. Но судя по документации This calling convention is not supported. Поэтому если есть исходники то добавь к дельфовой функции модификатор stdcall.
... << RSDN@Home 1.1 beta 1 (np: тихо) >>
Здравствуйте, DrL, Вы писали:
DrL>Уважаемые, вот столкнулся с такой проблемой: требуется на C# вызвать
DrL>функцию, реализованную в DLL, НО DLL написана на Delphi!!!
DrL>MSDN читал, MessageBox вызывать научился
DrL>Проблема IMHO в передаче параметров. Установлено опытным путем, что для
DrL>паскалевской функции
DrL>function Test(var a:integer) : integer;export;
DrL>begin
DrL> Result := a;
DrL>end;
DrL>при вызове ее так
DrL>[DllImport("mydll", CallingConvention = CallingConvention.StdCall)]
DrL> public static extern int Test(int a);
DrL>Результатом является всегда одно и тоже число, причем независипо от
DrL>CallingConvention и передачи параметра ref или [In, Out].
DrL>Но это все цветочки, а вот ягодки здесь: функция, которую надо вызвать такая:
DrL> function LInv(var n : integer; //размер динамических массивов
DrL> var dReIn : array of double;//динамический массив (вход)
DrL> var dImIn : array of double;//динамический массив (вход)
DrL> var dReOut : array of double;//динамический массив (выход)
DrL> var dImOut : array of double//динамический массив (выход)
DrL> ) : integer;export;
DrL>Если не понятно, то Функция обрабатывает первые два массива и записывает значения
DrL>во вторые два массива. Результат функции — код ошибки. Если вызывать из
DrL>Delphi, то все работает отлично.
DrL>Подскажите, если кто сталкивался, как можно такую функцию на C# вызвать.
DrL>Я уже много всяких вариантов перепробовал,
DrL>осталось только исполнить танец с бубном вокруг компьютера — авось заработает.
DrL>(Переписать функцию не предлагать, это физически невозможно!)
DrL>Leonid, Dr-L@yandex.ru
1. А может MC++ (знаю что тема "...из C#", но ведь надо просто 10 строк написать)
2. Написать другую ДЛЛ на дельфи, которая будет обёрткой для твоей