2012-09-10 15 views
5

Estoy trabajando en the Autofac project tratando de convertir toda nuestra lógica común en Portable Class Libraries y agregando bibliotecas específicas de plataforma para funcionalidades específicas.¿Cómo puedo ejecutar con éxito secannotate.exe en una biblioteca que depende de una Biblioteca de clases portátil?

Mi máquina de desarrollo es Windows 8 Enterprise (64 bits) y tengo VS 2012 Ultimate instalado con todos los adornos. No tengo instaladas herramientas de .NET Framework anteriores, herramientas adicionales ni herramientas adicionales específicas de PCL. Es una máquina virtual limpia y nueva con solo material básico. Todo se desarrolla y las pruebas funcionan bien en esta configuración.

Cuando intenta ejecutar secannotate.exe en una biblioteca .NET 4.5 (el perfil completo) que depende de una de las bibliotecas de clases portátiles, consigo un error que indica que necesito mscorlib 2.0.5.0.

Aquí hay un error de ejemplo. La PCL es Autofac.dll; la biblioteca de perfil completo de .NET 4.5 es 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) 

Los objetivos Biblioteca de clases portable autofac:

  • .NET 4.0
  • Silverlight 5
  • .NET para Windows para almacenar aplicaciones

Puede reproducir el problema mediante la creación de una PCL nueva/vacía que apunta a esas cosas y la construye. Verás que hace referencia a mscorlib 2.0.5.0.

Algunas búsquedas me llevan a creer que esta es una referencia a la antigua versión del ensamblaje de Silverlight, pero los proyectos PCL no tienen referencias de versión específicas, así que solo puedo imaginar que las herramientas PCL de VS 2012 las están poniendo. Otras personas parecen haber solucionado problemas similares al instalar una actualización de .NET Framework que salió antes de VS 2012. No puedo encontrar mscorlib 2.0.5.0 en ninguna parte de mi máquina.

Buscando en dotPeek en la asamblea Autofac.dll he construido, lo veo hace referencia a:

  • mscorlib 2.0.5.0
  • Sistema 2.0.5.0
  • System.ComponentModel.Composition 2.0.5.0
  • System.Core 2.0.5.0

Y, de nuevo, es sólo un proyecto PCL, no se hace referencia directa anyth En g. Literalmente - hay no hay una sola línea de referencia en el archivo .csproj.

¿Cómo resuelvo este problema de secanotato? ¿Hay algo adicional que deba instalar? ¿Hay algún parámetro que debería estar agregando a la línea de comando secannotate?

Respuesta

3

lo necesario para aprobar el modificador/d, apuntando a los conjuntos de referencia biblioteca portátil, por ejemplo:

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

Tome nota de que obtendrá advertencias alrededor de escritorio de mezcla y mscorlib CoreCLR, que puede ser ignorado porque aunque "portable" se parece a CoreCLR (Silverlight) para secanotar, no es cuando se ejecuta bajo el contexto de .NET Framework.

+0

por favor rápido =), no podemos entrar en funcionamiento con una PCL en el proyecto .. en el entorno productivo no hay forma de hacer referencia a los ensamblados de este marco 2.0.5.0 ... – benwasd

+0

He actualizado la respuesta. –

+0

esto corrige solo la verificación en la máquina de desarrollo. ¿no? en los clientes solo se instaló .NET 4.0, mi ensamblado PCL dirigido a .NET 4.0 aún no se puede cargar ... – benwasd

1

Mscorlib versión 2.0.5.0 fue referenciada en una versión anterior de PCL, antes VS2012.

Hay una manera clara de cómo terminar con una dependencia de ella. Si comenzó con Autofac-2.6.3.862-Portable.descarga de zip entonces obtendrá una versión de Autofac.dll que de hecho tiene una dependencia 2.0.5.0 mscorlib. Algo que se puede ver con ildasm.exe, hacer doble clic en el manifiesto:

// 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.. 

Así que, de alguna manera , su Autofac.Configuration.dll fue construido a partir de un proyecto que hace referencia a esa versión de Autofac.dll en lugar de la uno que construiste Eliminar esa referencia del proyecto. Use Proyecto + Agregar referencia y use la pestaña Proyecto en su lugar, marcando su proyecto Autofac.

+1

Pensé que también debe haber una referencia anterior, pero ya he comprobado que no. Es todo en una gran solución, todas las referencias de proyectos. Triple marcada. Es por eso que me tiene perplejo. –

+0

Agregué más información a la pregunta: aparecen las plataformas de destino para el ensamblaje y las referencias que estoy viendo. –

Cuestiones relacionadas