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
Відповідність типів даних див. У таблиці