为什么我无法调试动态加载的程序集?
我正在开发一个Web API项目,该项目使用内部模拟框架,允许拦截和修改来自控制器的响应。 它使用MEF加载一个程序集,该程序集包含在匹配某些前提条件时执行的代码。
我知道这是正常的,因为我可以在响应中看到模拟已经执行,但由于某种原因我无法调试动态加载的程序集中的代码。 虽然断点看起来很活跃,但执行永远不会破坏。
我试过调用Debugger.Break();
它确实中断,但调用堆栈显示为空,Visual Studio仅显示此消息:
我可以看到程序集及其符号已加载到模块窗口中:
我可以在调用动态加载的程序集( behavior
参数)之前中断,如下所示:
private HttpResponseMessage ApplyBehavior( IMockBehavior behavior, string controller, string action, HttpRequestMessage request, HttpResponseMessage mockedResponse) { return behavior.Apply(controller, action, request, mockedResponse); }
如果我尝试在立即窗口中检查behavior
变量,Visual Studio将显示以下exception:
behavior.GetType() 'behavior.GetType()' threw an exception of type 'System.IO.FileNotFoundException' Data: {System.Collections.ListDictionaryInternal} FileName: null FusionLog: null HResult: -2147024894 HelpLink: null InnerException: null Message: "Cannot load assembly 'SuperMam.WebAPI.Mocking'." Source: null StackTrace: null TargetSite: null
这是一个相当大的应用程序的一部分,我无法提取相关的部分。 我试图收集尽可能多的信息,但仍然不知道为什么会发生这种情况。
我该怎么做才能解决这个问题?
编辑1
只是为了确定,如果我从控制器调用代码,我可以正常进入它:
var behaviourType = AppDomain.CurrentDomain.GetAssemblies() .First(a => a.FullName.Contains("SuperMam.WebAPI.Mocking")) .GetType("SuperMam.WebAPI.Mocking.MyBehaviour"); var behavior = (IMockBehavior)Activator.CreateInstance(behaviourType); // I can step into this, and view the behaviour variable in the watch behavior.Apply("dummy", "dummy", Request, null);
但即使我这样做,当模拟框架调用相同的方法时,我也无法介入它。
编辑2
我还注意到同一个程序集(FullName相同)被加载两次。 两个实例之间的区别是它们的CodeBase
和Location
属性:
- 其中一个CodeBase等于我的应用程序的bin目录,而Location等于
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...
- 另一个的CodeBase等于第一个位置(
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...
),而Location是一个空字符串。
这可能是问题的原因吗?
您尝试动态加载的程序集是否在您的系统上编译?
为了调试动态加载的程序集,您需要在DLL旁边有一个PDB文件。 该文件包含有关Visual Studio所需的程序集的调试信息。 在调试模式下编译程序集时,将在项目的./bin/Debug/
文件夹中自动创建PDB。 如果您已将DLL移动到其他位置,则尝试将PDB移动到同一位置。
您的应用程序已进入中断状态,但当前未执行所选调试引擎支持的代码。
我之前也遇到过此错误消息:
如果可能,您可以检查它是否与调试选项/设置或VS设置有关。
(1)VS2015的最新更新是更新3。
(2)启用使用托管兼容模式将是此问题的目录。
事实certificate,原因是我认为assembly没有被MEF加载。 它是使用Assembly.Load(File.ReadAllBytes(mockDllPath))
加载的。 由于程序集是从字节数组加载的,因此调试器没有可用的调试信息。
问题应该是由于用于加载组件的方法。
我想你正在使用:
Assembly.LoadFrom …
尝试使用
Assembly.Load