在非托管代码中调试.net程序集

时间:2011-03-08 16:19:42

标签: .net delphi

我在德尔福上写过gui, 我从.net程序集进行了可见的汇编,我从delphi调用它,它的工作原理。 但我无法进入我的.net程序集。 我在编译dll时执行delphi_project.exe,delphi_project.exe开始工作, 而我在.net dll的断点变得无法访问。我该如何解决?

编辑:vs2010 ult

1 个答案:

答案 0 :(得分:1)

由于点网虚拟机的设计,这是不可能的。

虚拟网络代码是在虚拟环境中运行的,而不是在机器上本地运行。

即使Dot网络代码被编译(而它可以被解释),它也不会被直接编译成本机Windows可执行文件:它被编译成CIL,然后由CLR解释或转换为x86操作码,操作码是在虚拟环境中运行。

这使得它在安全方面非常可靠,并允许一些高级技巧,如RTTI或垃圾收集,但它不是一个像其他任何过程一样的过程。

因此,您不能只是将Delphi可执行文件(这是一个真正的Windows可执行文件)传递到DotNet代码中。您可以使用C或C ++代码(如果您拥有所有调试信息,并使用Borland C ++构建器编译它),但您无法使用DotNet代码执行此操作。

你可以尝试在Delphi asm视图中逐步调试(快捷方式是Alt-F2),但是你会花很多时间在mscoree.dll库中,你永远不会知道你的DotNet程序的哪一行你正在执行。我怀疑你会像我一样:沉入asm代码......我们是人类,没有x86!

所以要调试你的应用程序:

  • 向两侧添加日志记录(Delphi + DotNet)
  • 创建一个纯粹的DotNet骨架应用程序,大小足以调用你想要测试的DotNet代码:这将允许你调试你的DotNet代码
  • 甚至更好,编写自动化测试:您的DotNet代码应该从DotNet端进行测试,并进行一些回归测试 - 然后它将在从Delphi调用时按预期进行集成和工作

最后一招:如果你想让你的DotNet代码在64位操作系统下运行没有任何问题,不要将你的程序集to the right target作为目标,因为当从Delphi应用程序运行时,它将在Wow64中执行,因为Delphi可执行文件仍然是32位。

编辑:PERHAPS A SOLUTION

经过一段时间的睡眠后,我想到了一个想法:在Delphi IDE中,您可以将一个进程附加到调试中。也许可以使用Visual Studio IDE执行相同的操作。

听起来可行:您可以通过IDE的某个菜单将Visual Studio调试器附加到任何正在运行的进程。

  

Visual Studio调试器具有   附加到进程的能力   在Visual Studio外部运行。您   可以使用此附加功能来完成   以下内容:

     
      
  • 调试未在Visual Studio中创建的应用程序。
  •   
  • 同时调试多个进程。你也可以调试   通过启动多个进程   单个内的多个项目   溶液
  •   
  • 调试在远程计算机上运行的进程。
  •   
  • 调试在无法轻松启动的单独进程中运行的DLL   例如,来自Visual Studio,a   服务或运行的ISAPI DLL   互联网信息服务。
  •   
  • 运行时进程崩溃时自动启动调试器   在Visual Studio之外。这是   即时调试。
  •   
     

来源:http://msdn.microsoft.com/en-us/library/3s68z0b3.aspx