2012-09-10 2 views
5

Je travaille sur the Autofac project en essayant de convertir toute notre logique commune en Portable Class Libraries et en ajoutant des bibliothèques spécifiques à la plate-forme pour des fonctionnalités spécifiques.Comment puis-je exécuter correctement secannotate.exe sur une bibliothèque qui dépend d'une bibliothèque de classes portable?

Ma machine de développement est Windows 8 Enterprise (64 bits) et j'ai installé VS 2012 Ultimate avec toutes les garnitures. Je n'ai pas installé de framework .NET, d'outils supplémentaires ou d'outils PCL supplémentaires. C'est une nouvelle machine virtuelle propre avec juste des trucs de base. Tout construit et les tests fonctionnent correctement dans cette configuration.

Lorsque je tente d'exécuter secannotate.exe sur une bibliothèque .NET 4.5 (profil complet) qui dépend de l'une des bibliothèques de classe portables, je reçois une erreur indiquant que je dois mscorlib 2.0.5.0.

Voici un exemple d'erreur. Le PCL est Autofac.dll; La bibliothèque de profils complète .NET 4.5 est Autofac.Configuration.dll.

Error running annotator: Could not find referenced assembly 'Assembly(Name=mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)'. Ensure that the reference paths and assemblies are setup correctly. 
Microsoft (R) .NET Framework Security Transparency Annotator 4.0.30319.17929 
Copyright (C) Microsoft Corporation. All rights reserved. 

Loaded assembly 'Autofac.Configuration' from 'C:\dev\opensource\autofac\trunk\build_output\bin\net40\Autofac.Configuration.dll'. 
Resolving assembly 'Assembly(Name=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)'. 
Loaded assembly 'mscorlib' from 'C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. 
Loaded referenced assembly from 'C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. 
Using core assembly: 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' from 'C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. 
Assembly 'Autofac.Configuration' is using transparency model 'Level 2'. 
Assembly 'mscorlib' is using transparency model 'Level 2'. 
Loaded assembly 'Autofac' from 'C:\dev\opensource\autofac\trunk\build_output\bin\net40\Autofac.dll'. 
Resolving assembly 'Assembly(Name=mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)'. 
    at Microsoft.Security.Tools.CciHostEnvironment.ResolvingAssemblyReference(IUnit referringUnit, AssemblyIdentity referencedAssembly) 
    at Microsoft.Security.Tools.CciHostEnvironment.LoadCoreAssembly() 
    at Microsoft.Security.Tools.CciHostEnvironment..ctor(ISecAnnotateHost host, String rootAssemblyPath) 
    at Microsoft.Security.Tools.SecAnnotate.LoadInputAssemblies() 
    at Microsoft.Security.Tools.SecAnnotate.AnnotateAssemblies() 
    at Microsoft.Security.Tools.SecAnnotate.Main(String[] args) 

Les objectifs de la bibliothèque de classe Portable Autofac:

  • .NET 4.0
  • Silverlight 5
  • .NET pour les applications Windows Store

Vous pouvez reproduire le problème en créant un PCL nouveau/vide ciblant ces choses et le construisant. Vous verrez les références mscorlib 2.0.5.0. Certaines recherches me portent à croire qu'il s'agit d'une référence à l'ancienne version de l'assembly Silverlight, mais les projets PCL n'ont pas de références de versions spécifiques, je ne peux qu'imaginer que cela se passe avec les outils PCL VS 2012. D'autres personnes semblent avoir corrigé des problèmes similaires en installant une mise à jour du framework .NET qui est sortie avant VS 2012. Je ne trouve pas mscorlib 2.0.5.0 sur ma machine.

regardant dans dotPeek à l'assemblée Autofac.dll je construit, je le vois Références:

  • mscorlib 2.0.5.0
  • Système 2.0.5.0
  • System.ComponentModel.Composition 2.0.5.0
  • System.Core 2.0.5.0

Et, encore une fois, il est juste un projet PCL, pas directement référence anyth ing. Littéralement - il n'y a pas une seule ligne de référence dans le fichier .csproj.

Comment puis-je résoudre ce problème secondaire? Y a-t-il quelque chose de plus à installer? Y a-t-il un paramètre que je devrais ajouter à la ligne de commande secannotate?

Répondre

3

Vous devez passer le commutateur/d, en montrant les ensembles de référence bibliothèque portable, par exemple:

secannotate /v "Autofac.Configuration.dll" /d:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0" 

Prenez note que vous obtiendrez des avertissements autour de bureau mélange et CoreCLR mscorlib, qui peut être ignorée, car Bien que "portable" ressemble à CoreCLR (Silverlight) pour se remarcher, ce n'est pas lorsqu'il est exécuté dans le contexte de .NET Framework.

+0

s'il vous plaît rapide =), nous ne pouvons pas aller vivre avec un PCL dans le projet .. sur l'environnement productif il n'y a aucun moyen de référencer ces assemblys de framework 2.0.5.0 ... – benwasd

+0

J'ai mis à jour la réponse. –

+0

cela corrige uniquement la vérification sur la machine de développement. non? sur les clients étaient seulement. NET 4.0 est installé mon assembly PCL ciblé .NET 4.0 ne peut toujours pas être chargé .. – benwasd

1

Mscorlib version 2.0.5.0 a été référencée dans une ancienne version de la PCL, avant VS2012.

Il y a une façon claire de savoir comment vous pourriez vous retrouver avec une dépendance à ce sujet. Si vous avez commencé avec le Autofac-2.6.3.862-Portable.téléchargement zip alors vous obtiendrez une version de Autofac.dll qui a en effet une dépendance mscorlib 2.0.5.0. Quelque chose que vous pouvez voir avec ildasm.exe, double-cliquant sur le manifeste:

// Metadata version: v4.0.30319 
.assembly extern retargetable mscorlib 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       // |.....y. 
    .ver 2:0:5:0 
} 
.assembly extern retargetable System.Core 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       // |.....y. 
    .ver 2:0:5:0 
} 
// etc.. 

Donc, en quelque sorte , votre Autofac.Configuration.dll a été construit à partir d'un projet qui faisait référence à cette version de Autofac.dll au lieu du celui que vous avez construit. Supprimez cette référence du projet. Utilisez Projet + Ajouter une référence et utilisez l'onglet Projet à la place, en cochant votre projet Autofac.

+1

Je pensais qu'il devait y avoir une vieille référence aussi, mais j'ai déjà vérifié - il n'y en a pas. Tout est dans une grande solution, toutes les références du projet. Triple-vérifié. C'est pourquoi ça m'a bloqué. –

+0

J'ai ajouté quelques informations supplémentaires à la question - les plates-formes cibles pour l'assemblage et les références que je vois apparaître. –

Questions connexes