首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Reflector将Delphi vcl.net应用程序转换为c#

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

Stack Overflow用户
提问于 2011-05-15 00:58:51
回答 2查看 1.6K关注 0票数 0

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-15 02:35:15

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

这就是为什么。

当你使用delphi (8),2005,2006或2007创建一个vcl应用程序时,delphi编译器创建一个.NET应用程序,内部类是包装器和助手来调用真正的.net类,这些类(包装器)是为了方便现有的delphi win32开发人员创建.net应用程序而创建的。

考虑这个示例。

这是一款delphi .net应用程序

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
            }
        }
    }
}

但是使用反射器,你会得到第一个片段的结果

代码语言:javascript
复制
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名称空间的一部分。

反射器可以帮助你自动翻译一些代码片段,但不能翻译完整的应用程序。

票数 6
EN

Stack Overflow用户

发布于 2011-05-15 10:27:53

答案是否定的,即使您部署了相应的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...“键入prefix,这样在Visual Studio中使用时,实际的框架程序集看起来就像C#程序集一样。这并不是一件容易的事情,但我的框架中的所有类型、常量等都以"Csi“、"App”、"Fwk“或"Dev”为前缀,这使得这一点成为可能。如果没有这一点,我就无法剥离特定于Deplhi的标识符命名约定。

除非这样做有压倒性的好处,超过了成本(比如我),而且你的代码本质上是非可视化的(比如我),否则涉及的工作量可能太大了,以至于无法证明这项工作的合理性。我想知道我是不是世界上唯一一个成功地将大量代码从Delphi迁移到Visual Studio中的Delphi开发人员。似乎没有其他人能够提供这样一个成功的故事,这真的让你想知道这有多可行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6003369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档