在运行时从另一个AppDomain调试动态加载的DLL

8

好的,在解决如何在运行时热加载DLL后(请参阅我之前的帖子),我注意到在新加载的DLL中插入的断点并没有被触发。

情况
我有一个服务器应用程序,我想避免每次更改动态加载的DLL(通过反射)时终止/重新运行它。

目标
这是我正在尝试做的事情(我知道这本身可能不可能):

  • 运行Application.exe
  • 在其中使用新的AppDomain加载Process.dll并运行进程
  • 调试Process.dll
  • 卸载Process.dll
  • 编辑Process代码,重新编译Process.dll
  • Application.exe中动态重新加载它
  • 调试Process.dll
  • 等等...

问题
我注意到,当以调试模式启动Application.exe时,从另一个AppDomain加载的代码无法被连接到Application.exe的调试器访问 (我猜如果我直接从可执行文件启动Application.exe,没有办法让VS调试器调试任何东西,包括新加载的DLL)

可能的解决方法
一个解决方法(丑陋的)是将DLL的“注入”分离到一个单独的可执行文件中,然后可以通过VS调试器进行监视。

我必须承认我有点困惑。 有什么有效、清晰的想法吗?


这非常奇怪。我有一个应用程序服务器,它将应用程序加载到辅助应用程序域中,我设置断点时没有任何问题。Process.dll文件是否是您所使用的解决方案的类项目的输出,以启动Application.exe? - Pieter van Ginkel
根据你提到的问题,似乎你还没有解决卸载程序集的问题。在这种情况下,由于调试符号不匹配,你的代码不会出错。 - Sam Trost
可能是您的应用程序在加载 DLL 的位置与在调试模式下构建 DLL 的位置不一致。 - Asher
2个回答

3

由于这可能有助于他人(因为这是我搜索结果的顶部),我发现将DLL的引用添加到“其他”项目中可以调试被“注入”的程序集。虽然我不会像这样部署我的解决方案,但它至少让我能够调试注入代码以解决一个本来稳定的代码问题。这表明IDE在确定程序集标识(或类似内容)时查看引用。

在这种情况下,DebugBreak() 没有任何作用,只有添加了引用才能通知VS调试器。我没有测试过,但想象任何其他调试器都能正常工作,因此这表明IDE明确忽略了信号(其他 DebugBreak() 可以正常工作)。

作为一名经验丰富的.NET开发人员,我必须说这个问题对我来说是新的,即如果我们加载Windows 2000、VS.NET 2001-2002和相同的测试代码,则断点将正常工作。

根据OP之前的帖子,最有可能的是正在加载的程序集实际上具有不同的标识,即使它是相同的程序集,但从不同的位置/机制加载(例如),CLR也将其识别为唯一的程序集,因此IDE也会这样做。

一些读者可能会在某些场景中发现LoaderOptimization有用,其中它们在应用程序域之间加载相同的程序集并注意到同一个程序集被多次加载。

希望对某人有所帮助,我被卡住了大约一个小时。谢谢。


谢谢您的见解。这是一个有趣的解决方案。 - Mehdi LAMRANI

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接