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

本文关键字:应用 程序转换 net vcl Reflector Delphi 使用 | 更新日期: 2023-09-27 17:56:41

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

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

我可以解码 delphi.net vcl并将其转换为C#应用程序吗,该应用程序可以使用Visual Studio完全成功编译。

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

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 应用程序。

请考虑此示例。

这是一个德尔福.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 可以帮助您以自动化方式翻译一些代码片段,但不能翻译完整的应用程序。

答案是否定的,即使您部署了相应的 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开发人员。似乎没有其他人能够提供这样的成功故事,这真的让你想知道这有多可行。