Использование unmanaged DLL из C#
От: DrL  
Дата: 20.07.03 11:11
Оценка:
Уважаемые, вот столкнулся с такой проблемой: требуется на 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
Re: Использование unmanaged DLL из C#
От: Arslan Украина  
Дата: 20.07.03 12:55
Оценка:
Здравствуйте, 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 >>
Re[2]: Использование unmanaged DLL из C#
От: Igor Trofimov  
Дата: 20.07.03 13:57
Оценка:
A>а в паскале (если не ошибаюсь) 16 бит

давно 32.
Re: Использование unmanaged DLL из C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 20.07.03 16:49
Оценка:
Здравствуйте, DrL, Вы писали:

DrL>[DllImport("mydll", CallingConvention = CallingConvention.StdCall)]


А почему StdCall? По умолчанию в Дельфи FastCall. Но судя по документации This calling convention is not supported. Поэтому если есть исходники то добавь к дельфовой функции модификатор stdcall.
... << RSDN@Home 1.1 beta 1 (np: тихо) >>
AVK Blog
Re: Использование unmanaged DLL из C#
От: vvs86 Великобритания  
Дата: 20.07.03 18:45
Оценка:
Здравствуйте, 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. Написать другую ДЛЛ на дельфи, которая будет обёрткой для твоей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.