Comment éviter SerializationException: le Type n'est pas résolu pour le membre XXX lors du test d'un composant qui utilise le contexte Logicalcall

j'ai récemment commencé à frapper l'exception suivante dans mon code de test unitaire (NUnit) quand EF essaie de charger des informations de L'application.config:

System.Runtime.Serialization.SerializationException : Type is not resolved for member [my type name], [my assembly name]

cela se produit à la fois avec le NUnit GUI runner et avec R#'S VS-Integrated runner. Voici un test unitaire rapide qui reproduit le problème:

[Test]
public void Test()
{
    // adding 
    // ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    // here fixes things, probably because the configuration is cached

    CallContext.LogicalSetData("FooSlot", new Foo()); // removing this line fixes things
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // fails with above exception
}

[Serializable] // removing this gives a different exception complaining that Foo is not Serializable
public class Foo // : MarshalByRefObject // this fixes things
{ 
}

en utilisant le visualiseur de journal de fusion, j'ai trouvé que la défaillance était le résultat d'un

FILE_NOT_FOUND HRESULT

"151970920 d'erreur". Fondamentalement, il semble que l'ouverture de la configuration provoque en quelque sorte L'envoi de L'objet Foo retour au domaine app original (nunit runner), qui essaie ensuite de charger mon assemblée et ne peut pas la trouver parce qu'elle n'est pas dans le dossier bin. En fait, j'ai confirmé que copier mon assemblage dans le dossier NUnit runner bin est une autre façon de résoudre le problème.

à ce stade, il semble que l'utilisation de MarshalByRefObject est la meilleure option. Cependant, j'aimerais ici si il ya de meilleures options et/ou si quelqu'un peut offrir une explication approfondie de ce qui se passe exactement et pourquoi. Y a-t-il des inconvénients à utiliser MarshalByRefObject ici?

Ce qui est différent de cette question , parce que j'ai déjà identifié MarshalByRefObject comme une solution possible et essaie de comprendre le problème plus en profondeur, de comprendre les conséquences de la MarshalByRefObject . La réponse à ce post, c'est juste un appel à MarshalByRefObject sans aucun détail supplémentaire utile.

28
demandé sur Community 2014-04-01 00:27:24

1 réponses

je pense que c'est une bonne explication pourquoi vous obtenez cette erreur.

Est-il possible d'utiliser la logique contexte d'appel au sein d'une unité de test de VS 2010?

j'ai cherché ce qui est une bonne option ceci. Je ne trouve jamais de réponse à part MarshalByRefObject. Alors pourquoi hériter de votre objet avec . C'est une bonne explication

Maréchal En Valeur

objets ne sont valables que dans le domaine d'application où ils sont créés. Toute tentative de passer l'objet comme paramètre ou de le retourner comme résultat échouera à moins que L'objet ne dérive de MarshalByRefObject ou ne soit marqué comme Serialisable. Si l'objet est marqué comme Sérialisable, l'objet sera automatiquement activé, transportés à partir d'un domaine d'application à l'autre, et puis désérialisé de produire une copie exacte de l'objet dans le deuxième domaine d'application. Ce processus est généralement appelé marshal par valeur.

c'est la source. Il est bon pour Understading Sérialisation d'un Objet Concepts

https://msdn.microsoft.com/en-us/library/ms973893.aspx

je vous Remercie de cette question, j'ai cherché et appris bien des choses.

3
répondu Sercan Timoçin 2017-05-23 12:33:47