Я работаю над проектом Autofac, пытаясь преобразовать всю нашу общую логику в Переносимые библиотеки классов и добавление платформозависимых библиотек для определенных функций.
Мой компьютер для разработки — Windows 8 Enterprise (64-разрядная версия), и у меня установлен VS 2012 Ultimate со всеми настройками. У меня не установлены какие-либо предыдущие материалы .NET framework, какие-либо дополнительные инструменты или какие-либо дополнительные инструменты, специфичные для PCL. Это чистая новая виртуальная машина с базовыми компонентами. В этой конфигурации все сборки и тесты выполняются нормально.
Когда я пытаюсь запустить secannotate.exe на .NET 4.5 (полный profile), которая зависит от одной из переносимых библиотек классов, я получаю сообщение об ошибке, указывающее, что мне нужна mscorlib 2.0.5.0.
Вот пример ошибки. PCL — это Autofac.dll; библиотека полного профиля .NET 4.5 — 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)
Портативная библиотека классов Autofac нацелена на:
- .NET 4.0
- Сильверлайт 5
- .NET для приложений Магазина Windows
Вы можете воспроизвести проблему, создав новый/пустой PCL, ориентированный на эти вещи, и построить его. Вы увидите, что он ссылается на mscorlib 2.0.5.0.
Некоторые поиски приводят меня к мысли, что это ссылка на старую версию сборки Silverlight, но проекты PCL не имеют ссылок на конкретные версии, поэтому я могу только предположить, что это вставляется инструментами PCL VS 2012. Похоже, что другие люди исправили аналогичные проблемы, установив обновление .NET framework, вышедшее до VS 2012. На самом деле я нигде не могу найти mscorlib 2.0.5.0 на своем компьютере.
Глядя в dotPeek на сборку Autofac.dll, которую я создал, я вижу ссылки на нее:
- мскорлиб 2.0.5.0
- Система 2.0.5.0
- Система.КомпонентМодель.Композиция 2.0.5.0
- Система.Ядро 2.0.5.0
И, опять же, это всего лишь проект PCL, ни на что напрямую не ссылающийся. Буквально — в файле .csproj ни одной строки ссылки.
Как решить эту проблему секаннотирования? Нужно ли мне установить что-то еще? Есть ли параметр, который я должен добавить в командную строку secannotate?