.Net Framework →  Вызов функций из неуправляемой библиотеки (unmanaged dll) на примере Delphi

В данной статье будет рассмотрен пример как вызывать процедуры и функции из бинарного dll, то есть не IL код, а библиотеки написанной не на .Net (например Delphi)

Причины данного действия могут быть самые разные, например: использование готового куска кода написанного на другом языке (не .NET); специальное написание куска кода на unmanaged code с целью защиты от дизассемблеров и декомпиляторов

Итак, имеем динамическую библиотеку dllform.dll написанную на Delphi в которой объявлены функция


function CreateForm(Caption: PWideChar): LongWord; stdcall; external 'DllForm.dll' name 'CreateForm';


Функция создает обычную форму и возвращает указатель на нее, в качестве параметра передается строка – title окна, а процедура закрывает эту форму передавая в качестве параметра указатель на форму

Теперь самое время поговорить о соответствии типов данных C# и Delphi


Delphi C#
Integer int
Cardinal uint
Shortint sbyte
Smallint short
Longint int
Int64 long
Byte byte
Word ushort
Longword uint
- char
- ulong
Double double
Single float
Real48 -
Extended -
Comp -
Currency -
- decimal
Boolean - bool
string - string
TDateTime - DateTime (класс)

Так как в C# не может быть методов вне классов, то создаем класс обертку, статические методы которого и будут вызывать функции dll.


public class LibWrap
{
[DllImport(@"dllform.dll")]
public static extern uint CreateForm([MarshalAs(UnmanagedType.LPWStr)] string Caption);

[DllImport(@"dllform.dll")]
public static extern void FreeForm(uint Handle);
}


Замечание:
Для передачи строковых параметров необходимо явно указывать маршализацию параметра, для типа DateTime необходимо преобразовать объект в формат понятный Delphi с помощью метода ToOADate()

После того как класс-обертка создан, создаем тестовое окно с двумя кнопками: первая вызывает функцию CreateForm создавая тем самым новую форму, вторая кнопка будет закрывать созданное окно

public partial class Form1 : Form
{
uint qwe;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
string widechar = "Привет";
qwe = LibWrap.CreateForm(widechar);
}

private void button2_Click(object sender, EventArgs e)
{
LibWrap.FreeForm(qwe);
}
}

©

комментарии:

Mikhail Trifonov 30.04.2010 12:49
+1
Только у меня к вам просьба, перенесите в блог .Net Framework
Чтобы как говориться пополнять статьи определённого блога, и искать будет проще :)
Антон 30.04.2010 16:46
как перенести свою публикацию в тематический блог?
Mikhail Trifonov 03.05.2010 06:49
нажми на редактирование статьи, а за тем в поле "Блог", вставь название блога ".Net framework" (без кавычек)
Mikhail Trifonov 03.05.2010 14:25
переименуй в .Net Framework буква F заглавная. Если всё правильно сделаешь, то зайдя по ссылке http://ru.enetri.com/blog/.Net%20Framework/ ты увидишь две статьи. Одну моя, одну свою. Извини, первый раз я тебе правильно написал, а второй раз с маленькой буквы.
+1Антон 03.05.2010 16:05
исправил
Enetri 04.05.2010 09:50
Можно обозвать ваш блог еще лаконичнее: .Net

Так будет меньше будет шансов на случайную ошибку. Или же стоит добавить это общеупотребительное сокращение в теги, для гибкости поиска.
Mikhail Trifonov 04.05.2010 17:39
Да можно. Я думаю даже лучше будет .NET

добавить комментарий: