我正在使用内部模拟框架的Web API项目上工作,该框架允许拦截和修改来自 Controller 的响应。它使用MEF加载一个程序集,该程序集包含在满足某些前提条件后执行的代码。

我知道这是正常工作的,因为我可以在响应中看到模拟已执行,但是由于某种原因,我无法调试动态加载的程序集中的代码。尽管断点看起来很活跃,但是执行从未停止过。

c# - 为什么我无法调试动态加载的程序集?-LMLPHP

我尝试调用Debugger.Break();并确实中断了,但是调用堆栈显示为空,而Visual Studio仅显示以下消息:

c# - 为什么我无法调试动态加载的程序集?-LMLPHP

我可以看到程序集及其符号已加载到模块窗口中:

c# - 为什么我无法调试动态加载的程序集?-LMLPHP

我能够在调用动态加载的程序集(behavior参数)之前中断,如下所示:

private HttpResponseMessage ApplyBehavior(
    IMockBehavior behavior,
    string controller, string action,
    HttpRequestMessage request,
    HttpResponseMessage mockedResponse)
{
    return behavior.Apply(controller, action, request, mockedResponse);
}

如果我尝试在立即窗口中检查behavior变量,Visual Studio将显示以下异常:
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

可以肯定的是,如果我从 Controller 中调用该代码,则可以正常进入该代码:
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是相同的)被加载了两次。这两个实例之间的区别在于它们的CodeBaseLocation属性:
  • 其中之一的CodeBase等于我的应用程序的bin目录,而Location等于C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...
  • 它们中的另一个具有等于第一个的Location(C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...)的CodeBase,并且Location是一个空字符串。

  • 这可能是问题的原因吗?

    最佳答案



    我之前也遇到过此错误消息:

    https://social.msdn.microsoft.com/Forums/en-US/99b43950-6c82-4945-ba16-04355abf9612/vs2015-breakpoints-dont-work?forum=vsdebug

    如果可能,您可以检查它是否与“调试”选项/设置或VS设置相关。

    (1)VS2015的最新更新为更新3。

    (2)启用使用托管兼容模式将是此问题的目录。

    关于c# - 为什么我无法调试动态加载的程序集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40505436/

    10-12 12:49
    查看更多