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

在非托管代码中调试.net程序集,.net,delphi,.net,Delphi,我在delphi上写了gui, 我从.net程序集中创建了comvisible程序集,我从delphi调用它,它可以工作。 但是我不能进入我的.net程序集。 我在编译dll时执行delphi_project.exe,delphi_project.exe开始工作, 我在.net dll上的断点变得不可访问。我怎样才能修好它 编辑:vs2010 ult这是不可能的,因为dot-net虚拟机的设计 Dot net代码是在虚拟环境中管理的,而不是在机器上本地运行 即使编译了Dot-net代码(尽管可以

我在delphi上写了gui, 我从.net程序集中创建了comvisible程序集,我从delphi调用它,它可以工作。 但是我不能进入我的.net程序集。 我在编译dll时执行delphi_project.exe,delphi_project.exe开始工作, 我在.net dll上的断点变得不可访问。我怎样才能修好它


编辑:vs2010 ult

这是不可能的,因为dot-net虚拟机的设计

Dot net代码是在虚拟环境中管理的,而不是在机器上本地运行

即使编译了Dot-net代码(尽管可以对其进行解释),它也不会直接编译为本机Windows可执行文件:它被编译为CIL,然后由CLR解释或转换为x86操作代码,这些操作代码在虚拟环境中运行

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

因此,您不能仅仅将Delphi可执行文件(这是一个真正的Windows可执行文件)传递到DotNet代码中。你可以用C或C++代码(如果你有所有的调试信息,并且用Borland C++ +Builder编译过),但是你不能用dotnet代码来完成。 您可以尝试在Delphi asm视图中进行逐步调试(快捷方式为Alt-F2),但您将在mscoree.dll库中花费大量时间,而且您永远不会知道正在执行的是哪一行DotNet程序。我怀疑你会像我一样:陷入asm代码中。。。我们是人类,不是x86

因此,要调试应用程序,请执行以下操作:

  • 向两侧添加日志记录(Delphi+DotNet)
  • 创建一个纯DotNet框架应用程序,其大小刚好足以调用要测试的DotNet代码:这将允许您调试DotNet代码
  • 更妙的是,编写自动化测试:您的DotNet代码应该从DotNet端进行测试,并进行一些回归测试,然后在从Delphi调用时,它将按照预期进行集成和工作
最后一个技巧:如果您想让您的DotNet代码在64位操作系统下运行而不出任何问题,请不要以程序集为目标,因为从Delphi应用程序运行时,它将在Wow64中执行,因为Delphi可执行文件仍然是32位的

编辑:可能是一个解决方案

睡了一会儿,我想到了一个主意:在DelphiIDE中,您可以将一个进程附加到调试中。也许可以对VisualStudioIDE执行同样的操作

这听起来是可行的:您可以通过IDE的一些菜单将VisualStudio调试器附加到任何正在运行的进程

VisualStudio调试器具有 能够附加到正在运行的进程 在VisualStudio外部运行。你 可以使用此附加功能来执行以下操作: 以下是:

  • 调试未在Visual Studio中创建的应用程序
  • 同时调试多个进程。您还可以进行调试 启动多个进程 单个项目中的多个项目 解决方案
  • 调试在远程计算机上运行的进程
  • 调试在无法轻松启动的单独进程中运行的DLL 例如,来自VisualStudio的 服务或与一起运行的ISAPI DLL 互联网信息服务
  • 当进程在运行时崩溃时,自动启动调试器 在VisualStudio之外。这是 实时调试
资料来源:


这是不可能的,因为dotnet虚拟机的设计

Dot net代码是在虚拟环境中管理的,而不是在机器上本地运行

即使编译了Dot-net代码(尽管可以对其进行解释),它也不会直接编译为本机Windows可执行文件:它被编译为CIL,然后由CLR解释或转换为x86操作代码,这些操作代码在虚拟环境中运行

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

因此,您不能仅仅将Delphi可执行文件(这是一个真正的Windows可执行文件)传递到DotNet代码中。你可以用C或C++代码(如果你有所有的调试信息,并且用Borland C++ +Builder编译过),但是你不能用dotnet代码来完成。 您可以尝试在Delphi asm视图中进行逐步调试(快捷方式为Alt-F2),但您将在mscoree.dll库中花费大量时间,而且您永远不会知道正在执行的是哪一行DotNet程序。我怀疑你会像我一样:陷入asm代码中。。。我们是人类,不是x86

因此,要调试应用程序,请执行以下操作:

  • 向两侧添加日志记录(Delphi+DotNet)
  • 创建一个纯DotNet框架应用程序,其大小刚好足以调用要测试的DotNet代码:这将允许您调试DotNet代码
  • 更妙的是,编写自动化测试:您的DotNet代码应该从DotNet端进行测试,并进行一些回归测试,然后在从Delphi调用时,它将按照预期进行集成和工作
最后一个技巧:如果您想让您的DotNet代码在64位操作系统下运行而不出任何问题,请不要以程序集为目标,因为从Delphi应用程序运行时,它将在Wow64中执行,因为Delphi可执行文件仍然是32位的

编辑:可能是一个解决方案

睡了一会儿,我想到了一个主意:在DelphiIDE中,您可以将一个进程附加到调试中。也许可以对VisualStudioIDE执行同样的操作

这听起来是可行的:您可以通过IDE的一些菜单将VisualStudio调试器附加到任何正在运行的进程

VisualStudio调试器具有 能够附加到正在运行的进程 在VisualStudio外部运行。你 可以使用此附加功能来执行以下操作: 以下是:

  • 调试未在Visual Studio中创建的应用程序
  • 调试多个进程