|
Навигация
|
Главная » Delphi .Net глазами дельфийца. Использование Delphi в .Net (исходники)Источник: Realcoding Для программистов, рассматривающих вопрос перехода на новую систему разработки, один из главных вопросов - как в новой системе можно будет использовать старые наработки.В настоящей статье рассмотрены некоторые простые способы использования наработок Delphi (автор использовал версию 6) в .Net. Естественно, полностью портировать Delphi в .Net под силу только разработчикам Borland (или аналогичным серьезным людям, владеющим к тому же полными исходниками Delphi), поэтому здесь мы не будем рассматривать клиентские (визуальные) приложения, использующие VCL. Тем не менее некоторый объем функционального кода, реализованного в Delphi, может быть использован и в .Net (пример такого кода - вычислительные модули). Итак, для переноса Delphi-кода в .Net можно использовать следующие способы:
Техника переноса алгоритмов на другие языки знакома многим программистам. Более того, существуют автоматические трансляторы типа Pas2C, которые входной паскалевский код преобразуют в C/C++-код (естественно, кое-что приходится править потом вручную, но основа получается вполне приемлемая). Не останавливаясь подробно на очевидных моментах ручной трансляции кода, хотелось бы напомнить следующее:
Если же исходный код реализован, например, в виде набора классов 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 { /// /// Обертка для вызова функций Delphi, размещенных в DLL /// public class LibWrap { /// /// Процедура без параметров /// [ DllImport( @"C:ProjectsC#DelphiPortalDll1.dll" ) ] public static extern void Proc1(); /// /// Процедура с целочисленными параметрами /// [ DllImport( @"C:ProjectsC#DelphiPortalDll1.dll" ) ] public static extern void Proc2(int A, int B); /// /// Процедура с вещественными параметрами /// [ DllImport( @"C:ProjectsC#DelphiPortalDll1.dll" ) ] public static extern void Proc3(double A, double B); /// /// Процедура с логическими параметрами /// [ DllImport( @"C:ProjectsC#DelphiPortalDll1.dll" ) ] public static extern void Proc4(bool A, bool B); /// /// Процедура с параметрами типа дата/время /// [ DllImport( @"C:ProjectsC#DelphiPortalDll1.dll" ) ] public static extern void Proc5(double A, double B); /// /// Процедура со строковыми параметрами /// [ DllImport( @"C:ProjectsC#DelphiPortalDll1.dll" ) ] public static extern void Proc6( [MarshalAs(UnmanagedType.LPStr)] string A, [MarshalAs(UnmanagedType.LPStr)] string B); } /// /// Тестовый класс /// 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# стОит обратить внимание на следующее:
Т.к. пакеты в Delphi - не что иное, как DLL, такой вариант выглядел возможным. Более того, с помощью утилиты Depends.Exe, входящей в состав VSN ( @$xp$14Class1@TClass1 @Class1@TClass1@ К сожалению, автору не удалось запустить таким образом объекты Акция компании Embarcadero: Обновите Delphi, C++Builder, RAD Studio - с ЛЮБОЙ версии!. Flash в Delphi. Быстрая обработка данных Excel в Delphi. Хороший выбор плохой архитектуры. DelphiX: Загрузка и вывод спрайтов. Главная » Delphi |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |