. Net очима дельфійців. Використання Delphi в. Net (исходники), Різне, Програмування, статті

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


У цій статті розглянуті деякі прості способи використання напрацювань Delphi (автор використав версію 6) в. Net. Природно, повністю перенести Delphi в. Net під силу тільки розробникам Borland (або аналогічним серйозним людям, які володіють до того ж повними исходниками Delphi), тому тут ми не будемо розглядати клієнтські (візуальні) додатки, що використовують VCL. Проте деякий обсяг функціонального коду, реалізованого в Delphi, може бути використаний і в. Net (приклад такого коду – обчислювальні модулі).


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



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


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


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


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



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





































































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 (клас)


Використання в. 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 Proc1; 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;


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



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


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


using System;


using System.Runtime.InteropServices;


namespace Test1


{


  /// <summary>


/ / / Обгортка для виконання функцій Delphi, розміщених в DLL


  /// </summary>


  public class LibWrap {


    /// <summary>


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


    /// </summary>


    [ DllImport( @”C:ProjectsC#DelphiPortalDll1.dll” ) ]


    public static extern void Proc1();


    /// <summary>


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


    /// </summary>


    [ DllImport( @”C:ProjectsC#DelphiPortalDll1.dll” ) ]


    public static extern void Proc2(int A, int B);


    /// <summary>


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


    /// </summary>


    [ DllImport( @”C:ProjectsC#DelphiPortalDll1.dll” ) ]


    public static extern void Proc3(double A, double B);


    /// <summary>


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


    /// </summary>


    [ DllImport( @”C:ProjectsC#DelphiPortalDll1.dll” ) ]


    public static extern void Proc4(bool A, bool B);


    /// <summary>


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


    /// </summary>


    [ DllImport( @”C:ProjectsC#DelphiPortalDll1.dll” ) ]


    public static extern void Proc5(double A, double B);


    /// <summary>


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


    /// </summary>


    [ DllImport( @”C:ProjectsC#DelphiPortalDll1.dll” ) ]


    public static extern void Proc6(


      [MarshalAs(UnmanagedType.LPStr)] string A,


      [MarshalAs(UnmanagedType.LPStr)] string B);


  }


  /// <summary>


/ / / Тестовий клас


  /// </summary>


  class Class1 {


    [STAThread]


    static void Main() {


/ / Виклик процедури без параметрів


      LibWrap.Proc1();


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


      LibWrap.Proc2(1, 2);


/ / Виклик процедури з речовими параметрами


      LibWrap.Proc3(1.5, -2.8);


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


      LibWrap.Proc4(true, false);


/ / Виклик процедури з параметрами типу дата / час


      DateTime dt1 = DateTime.Now;


      DateTime dt2 = dt1.AddDays(2);


      LibWrap.Proc5(dt1.ToOADate(), dt2.ToOADate());


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


LibWrap.Proc6 (“Рядок 1”, “Рядок 2”);


    }


  }


}


У коді C # стОит звернути увагу на наступне:



Хакерські способи


У каталозі FrameworkSDKSamplesTechnologiesInteropPlatformInvokeCustomCS є цікавий файл – ClassMethods.cs. У цьому файлі показано, як викликати класи VC + +, розміщені в DLL. Цей приклад наштовхнув автора статті на думку перевірити щось подібне з Delphi.


Т.к. пакети в Delphi – не що інше, як DLL, такий варіант виглядав можливим. Більш того, за допомогою утиліти Depends.Exe, що входить до складу VSN ( Common7ToolsBin), при дослідженні відповідного BPL-файлу можна навіть побачити імена експортованих функцій в стилі C + +, наприклад:


@$xp$14Class1@TClass1


@Class1@TClass1@


На жаль, автору не вдалося запустити таким чином об’єкти


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*