Преобразование приложения Delphi vcl.net в c # с помощью Reflector - PullRequest
0 голосов
/ 14 мая 2011

Я использовал отражатель до окончания пробного периода

Я успешно декодировал многие приложения.И в моем недавнем посте я смог определить, что он также может декодировать приложения delphi.net vcl (d2007).

Могу ли я декодировать delphi.net vcl и перевести его в приложение ac #, которое можно успешно скомпилировать, используявизуальная студия.

Ответы [ 2 ]

6 голосов
/ 14 мая 2011

Ответ на вопрос Can i decode delphi.net vcl app and translate it to a c# application which can be compiled success fully using visual studio ? - Нет

Вот почему.

Когда вы создаете приложение vcl net с использованием delphi (8), 2005, 2006 или 2007, компилятор delphi создает приложение .NET с большим количеством зависимостей от внутренних классов, которые являются обертками и помощниками для вызова реальных классов .net эти классы (оболочки) были созданы для облегчения создания приложений .net для существующих разработчиков Delphi win32.

Рассмотрим этот образец.

Это приложение Delphi .net

program DelphiNetConsole;

{$APPTYPE CONSOLE}    

uses
  SysUtils;    
begin
  try
    Writeln('Hello From Delphi 2007.Net');
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

если вы переведете этот код вручную на C #

using System;
using System.Text;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Hello From Delphi 2007.Net");
            }
            catch (System.Exception E)
            {
                Console.WriteLine(E.Message);
            }
        }
    }
}

Но используя отражатель, вы получите это для первого фрагмента

public static void DelphiNetConsole()

{
    System.IsConsole = true;
    try
    {
        TextOutput.Output.WriteWideString("Hello From Delphi 2007.Net", 0).WriteLn();
        System.@_IOTest();
    }
    catch (Exception exception1)
    {
        Exception exception2 = System.@ExceptObject = exception1;
        Exception E = exception1;
        TextOutput.Output.WriteWideString(TObjectHelper.ClassName(System.@GetMetaFromObject(E)), 0).WriteWideString(": ", 0).WriteWideString(E.Message, 0).WriteLn();
        System.@_IOTest();
        System.@ExceptObject = null;
    }
}

Как вы можете видеть, последний код вызывает много вспомогательных классов и функций (например, TextOutput), которые не являются частью стандартной среды .net, скорее, они являются частью пространства имен Borland.Delphi.System.

Reflector может помочь вам автоматически перевести некоторые фрагменты кода, но не полное приложение.

2 голосов
/ 15 мая 2011

Ответ - нет, и даже если вы развернете соответствующие сборки Delphi, такие как Borland.Delphi.dll и Borland.Vcl.dll, у вас есть структуры, не имеющие эквивалента в C #, например ссылки на классы, которые нельзя используется в Visual Studio / C #. Мне удалось преобразовать около 80000 строк невизуальной среды приложений в Delphi для использования в Visual Studio / C #, но мне потребовалось более 3 месяцев, и мне пришлось преобразовывать код, использующий такие вещи, как ссылки на класс, для использования класса System.Type , среди прочего. После всей этой работы, а также после развертывания некоторых основных сборок Delphi, сборки Indy и сборки Jcl теперь я могу разрабатывать либо в Delphi, либо в Visual Studio и поддерживать совместимость взаимодействия между двумя типами приложений.

Еще одна вещь, которую я сделал, - это запустить некоторую пользовательскую предварительную обработку исходного кода перед сборкой с раздеванием префикса типа «T ...», чтобы фактические сборки фреймворка выглядели так же, как сборки C # при использовании в Visual Studio , Это было непростой задачей, но стало возможным благодаря тому факту, что все типы, константы и т. Д. В моей структуре ВСЕ также имели префикс «Csi», «App», «Fwk» или «Dev». Без этого я не смог бы лишить соглашения об именовании идентификаторов, специфичных для Deplhi.

Если для этого нет огромных преимуществ, которые перевешивают затраты (как у меня), а ваш код по сути невизуален (как и я), количество затраченных усилий, вероятно, будет слишком велико, чтобы оправдать работу , Интересно, я единственный разработчик Delphi в мире, который успешно перенес значительное количество кода из Delphi для использования в Visual Studio. Никто другой, кажется, не может представить такую ​​историю успеха, которая действительно заставляет задуматься, насколько это возможно.

...