使用Reflector将Delphi vcl.net应用程序转换为c#

时间:2011-05-14 16:58:51

标签: c# delphi reflector

我使用过反射器直到试用期结束

我已成功解码了许多应用程序。通过我最近的帖子,我能够识别出它还可以解码delphi.net vcl apps(d2007)。

我可以解码delphi.net vcl并将其转换为c#应用程序,可以使用visual studio完全编译成功。

2 个答案:

答案 0 :(得分:6)

问题Can i decode delphi.net vcl app and translate it to a c# application which can be compiled success fully using visual studio ?的答案是

这就是为什么。

使用delphi(8),2005,2006或2007创建vcl net应用程序时,delphi编译器会创建一个.NET应用程序,它对内部类有很多依赖关系,这些内部类是包装器和帮助器来调用真正的.net类,创建这些类(包装器)是为了便于为现有的delphi win32开发人员创建.net应用程序。

考虑这个样本。

这是一个delphi .net app

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可以帮助您以自动方式翻译代码片段而不是整个应用程序。

答案 1 :(得分:2)

答案是否定的,即使你部署了相应的Delphi程序集,例如Borland.Delphi.dll和Borland.Vcl.dll,你也有一些在C#中没有等价的结构,比如类引用,不能在Visual Studio / C#中使用。我设法在Delphi中转换大约80,000行非可视化应用程序框架以在Visual Studio / C#中使用,但它花了我超过3个月而且我不得不转换使用类引用之类的代码来使用System.Type类除其他外。在完成所有这些工作之后,部署了一些基本的Delphi程序集,一个Indy程序集和一个Jcl程序集,我现在可以在Delphi或Visual Studio中进行开发,并保持两种类型的应用程序之间的通信兼容性。

我做的另一件事是在构建剥离“T ...”类型前缀之前运行源代码的一些自定义预处理,以便在Visual Studio中使用时实际框架程序集看起来就像C#程序集。这不是一项容易的任务,但是由于我的框架中的所有类型,常量等都是“Csi”,“App”,“Fwk”或“Dev”的所有类型,常量等都可以实现。如果没有这个,我就不能剥离Deplhi特定的标识符命名约定。

除非这样做的成本超过了成本(比如我),并且你的代码基本上是非可视的(比如我),否则所涉及的工作量可能太大而无法证明工作的合理性。我想知道我是否是世界上唯一成功从Delphi迁移大量代码以供Visual Studio使用的Delphi开发人员。没有其他人似乎能够提供这样的成功故事,这真的让你想知道这是多么可行。