Net очима дельфійців

Borland Delphi 7

Для програмістів, які розглядають питання переходу на нову систему розробки, один з головних питань - як в новій системі можна буде використовувати старі напрацювання.

Отже, для перенесення Delphi-коду в. Net можна використовувати такі способи:

- використання в. Net COM-об'єктів, розроблених в Delphi;

- використання в. Net бібліотек DLL. розроблених в Delphi;

переписування коду

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

Техніка перенесення алгоритмів на інші мови знайома багатьом програмістам. Більш того, існують автоматичні транслятори типу Pas 2 C. які вхідний паскалевская код перетворять в C / C ++ - код (природно, дещо доводиться правити потім вручну, але основа виходить цілком прийнятна).

Не зупиняючись детально на очевидних моментах ручної трансляції коду, хотілося б нагадати наступне:

- оскільки в C # немає процедур і функцій поза класів, для реалізації глобальних підпрограм доцільно використовувати спеціальний (-і) клас (и) зі статичними методами;

- оскільки в C # немає глобальних змінних, для їх реалізації доцільно використовувати спеціальний (-і) клас (и) зі статичними полями;

- для реалізації конструкцій, еквівалентних записів Delphi. можна використовувати як класи, так і структури (struct) - рішення залежить від обсягу даних, які, можливо, будуть копіюватися при передачі в якості параметрів та ін .;

- оскільки в C # об'єкти видаляються автоматично, необхідно ретельно проаналізувати послідовність створення і видалення об'єктів, особливо якщо в Delphi-об'єкт в деструкції виконувалося звільнення ресурсів - в таких випадках оптимальним варіантом буде або введення відповідних методів «закриття», або реалізація інтерфейсу IDisposable.

Нижче наводиться таблиця відповідності базових типів:

Використання в. Net COM-об'єктів, розроблених в Delphi

Оскільки стандарт OLE чітко визначає протокол обміну і формати даних, то ніяких особливостей при розробці COM-об'єктів в Delphi немає (не рахуючи того, що небажано використовувати імена методів, що збігаються з методами класу Object з C #: Equals, GetHashCode, GetType, ReferenceEquals, ToString).

Якщо ж вихідний код реалізований, наприклад, у вигляді набору класів Delphi. то можна написати в Delphi дуже простий COM-об'єкт (inproc - server), який буде виконувати функції фасаду (див. наприклад Шаблони проектування на www.dotsite.spb.ru).

До речі, у багатьох випадках введення «фасаду» дозволяє навіть спростити систему з боку основного коду.

Використання в. Net бібліотек DLL. розроблених в Delphi

Оскільки в Delphi дозволяє розробляти динамічні бібліотеки DLL. то можна існуючий Delphi-код «упакувати» в бібліотеку. Цей спосіб змушує виконати кілька більшу роботу в C #, ніж при використанні COM-об'єктів, хоча в деяких випадках цілком може бути використаний з міркувань, наприклад, швидкодії системи.

Виклик функцій DLL з C # досить непогано описаний в документації. Net. Нижче наводиться приклад використання DLL. розробленої в Delphi.

Заголовки DLL -функцій в Delphi:

// Процедура без параметрів

procedure Proc 1; stdcall;

// Процедура з цілочисельними параметрами

procedure Proc2 (A, B: integer); stdcall;

// Процедура з речовими параметрами

procedure Proc3 (A, B: double); stdcall;

// Процедура з логічними параметрами

procedure Proc4 (A, B: boolean); stdcall;

// Процедура з параметрами типу дата / час

procedure Proc5 (A, B: TDateTime); stdcall;

// Процедура із строковими параметрами

procedure Proc6 (P1, P2: PChar); stdcall;

Зверніть увагу на два моменти:

- використовується модифікатор виклику stdcall

- рядки в якості параметрів передаються як PChar

Відповідність типів даних див. У таблиці

Вихідний код в C #:

Схожі статті