Причины данного действия могут быть самые разные, например: использование готового куска кода написанного на другом языке (не .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);
}
}
©
комментарии:
Только у меня к вам просьба, перенесите в блог .Net Framework
Чтобы как говориться пополнять статьи определённого блога, и искать будет проще :)
Так будет меньше будет шансов на случайную ошибку. Или же стоит добавить это общеупотребительное сокращение в теги, для гибкости поиска.