Je travaille sur un projet d'API Web qui utilise un cadre interne de simulation qui permet d'intercepter et de modifier les réponses des contrôleurs. Il utilise MEF pour charger un assembly qui contient du code qui est exécuté si certaines conditions préalables sont reconnues.Pourquoi suis-je incapable de déboguer un assembly chargé dynamiquement?
Je sais que cela fonctionne correctement, car je peux voir dans la réponse que le simulacre a été exécuté, mais pour une raison quelconque, je suis incapable de déboguer le code dans l'assembly chargé dynamiquement. Bien que les points d'arrêt semblent actifs, l'exécution ne s'arrête jamais là.
J'ai essayé d'appeler Debugger.Break();
et il rompt en effet, mais la pile d'appel apparaît vide et Visual Studio montre que ce message:
je peux voir que l'assemblage et la les symboles sont chargés dans la fenêtre des modules:
Je suis en mesure de briser juste avant l'appel à l'assemblée chargée dynamiquement (paramètre behavior
), qui ressemble à ceci:
private HttpResponseMessage ApplyBehavior(
IMockBehavior behavior,
string controller, string action,
HttpRequestMessage request,
HttpResponseMessage mockedResponse)
{
return behavior.Apply(controller, action, request, mockedResponse);
}
Si je tente de inspectent la variable behavior
dans la fenêtre immédiate, montre Visual Studio l'exception suivante:
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
Cela fait partie d'une assez grande application, et je suis incapable d'extraire les parties pertinentes. J'ai essayé de rassembler autant d'informations que possible, mais je n'ai toujours aucune idée de la raison pour laquelle cela se produit.
Que puis-je faire pour résoudre ce problème?
EDIT 1
Juste pour être sûr, si j'appelle le code de mon contrôleur, je suis en mesure d'intervenir dans normalement:
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);
mais même quand je le fais, quand même méthode est appelée par le cadre moqueur, je ne peux pas y entrer.
EDIT 2
I a également remarqué que le même ensemble (FullName est identique) est chargé à deux reprises. La différence entre les deux cas est leur CodeBase
et Location
propriétés:
- L'un d'eux a CodeBase égal à mon répertoire bin applications et l'emplacement égal à
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...
- l'autre d'entre eux a CodeBase égal au premier son emplacement (
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...
), et l'emplacement est une chaîne vide.
Est-ce que cela pourrait être la cause du problème?
Qu'en est-il de ce problème? Pouvez-vous partager les dernières informations de votre côté? –
Ça se passe toujours. Je crois que cela est dû au fait que l'assemblage est chargé deux fois, mais je n'ai aucune idée de comment l'empêcher. –