2

Je déteste poser une question qui a été posée ici d'innombrables fois, aussi bien que blogué sur tout le lieu, mais je n'arrive toujours pas à faire fonctionner mon projet amélioré.L'assemblage en mode mixte [log4net] ne se chargera pas dans .NET 4.0, et ne fonctionnera pas une fois recompilé pour .NET 4.0

Mon application a été écrite en VS2008, ciblant .NET 3.5 SP1. J'ai juste mis à jour vers VS2010, et j'ai pensé que j'essaierais de profiter des nouvelles fonctionnalités de langage et de MEF intégré, donc j'ai changé tous mes projets pour cibler .NET 4.0. Après avoir tout obtenu (comme les événements post-construction, les références MEF, etc.) correctement configurés, j'ai exécuté mon application et j'ai reçu l'erreur toujours célèbre:

L'assemblage en mode mixte est construit sur la version 'v2 .0.50727 'du runtime et ne peut pas être chargé dans le runtime 4.0 sans informations de configuration supplémentaires.

J'ai ensuite ajouté l'attribut suivant à mon élément <startup> dans app.config:

<startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0"/> 
</startup> 

Mais quand je lance ma demande, je reçois toujours la même erreur. Y at-il quelque chose que je peux faire pour déboguer ce problème plus loin? Je n'ai littéralement aucune idée de quoi d'autre essayer. J'essaie de trouver autant d'informations que possible sur les assemblages en mode mixte et la façon dont ils interagissent avec le CLR, mais mes connaissances de base dans ce domaine sont au mieux limitées.

J'ai également essayé de contourner le problème en recompilant la source de log4net vers la cible .NET 4.0, mais cela n'a pas fonctionné comme je l'avais espéré. Après la compilation, je suis arrivé cette erreur:

règles de sécurité tout en héritage violé remplaçant membre: 'log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData (System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext). L'accessibilité de la sécurité de la méthode prioritaire doit correspondre à l'accessibilité de la méthode redéfinie.

donc j'ai trouvé un poste qui a recommandé d'essayer d'ajouter la ligne suivante à AssemblyInfo.cs:

[assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)] 

Et quand je l'ai fait, je me suis retrouvée tout de suite où j'ai commencé! (avec l'erreur d'assemblage en mode mixte).

Pouce.

+1

Vous avez recompilé pour 4.0 et * encore * le CLR le voit comme 2.0? Utilisez Fuslogvw.exe pour savoir ce qui se trouve réellement. Méfiez-vous du GAC. –

+0

@Hans merci pour le pourboire, je vais regarder dans cela! – Dave

+0

Nous avons également porté certains de nos projets à 4.0 à partir de la version 3.5 mais n'avons eu aucun problème avec log4net ... le seul problème est survenu lors de l'utilisation de log4net dans les nouveaux projets qui tournaient sur le profil client. stackoverflow.com/questions/1767253/log4net-with-net-4-0/2679007#2679007). – veljkoz

Répondre

0

J'ai fini par tout faire fonctionner après avoir recompilé la source, en ciblant .NET 4.0. Je n'aime toujours pas ça parce que tout le monde dit que ça devrait marcher. La seule chose que je devais aussi faire pour que l'application fonctionne enfin était d'utiliser MEF2 de CodePlex, et pas celui intégré dans .NET 4.0. Je ne vois pas pourquoi ces deux choses seraient liées, mais je vais revenir en arrière et essayer de le faire fonctionner avec log4net tel quel. Je publierai les détails ici une fois que j'ai terminé, et j'espère que cela aidera quelqu'un d'autre qui a rencontré le même problème.

Questions connexes