使用 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完全成功编译。
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开发人员。似乎没有其他人能够提供这样的成功故事,这真的让你想知道这有多可行。