我正在使用一个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的节目以下例外:
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
我还注意到,相同的组件(全名是相同的)被加载两次。在两个实例之间的区别是他们CodeBase
和Location
属性:
- 他们中的一个具有基本代码等于我的应用程序的bin目录和位置等于
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...
- 他们的另一个具有基本代码等于第一一个人的位置(
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...
),而位置是一个空字符串。
难道这是问题的原因?
这个问题呢?你能分享你身边的最新信息吗? –
它仍在发生。我相信这是由于程序集被加载两次,但我不知道如何防止它。 –