Как я могу успешно запустить secannotate.exe в библиотеке, которая зависит от переносимой библиотеки классов?

Я работаю над проектом 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?


person Travis Illig    schedule 10.09.2012    source источник


Ответы (2)


Вам нужно передать ключ /d, указывающий на эталонные сборки Portable Library, например:

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

Обратите внимание, что вы получите предупреждения о смешивании рабочего стола и CoreCLR mscorlib, которые можно игнорировать, потому что, хотя «переносимый» выглядит как CoreCLR (Silverlight) для разделения, он не работает в контексте .NET Framework.

person David Kean    schedule 11.09.2012
comment
пожалуйста, быстро =), мы не можем запустить PCL в проекте.. в производственной среде нет возможности ссылаться на эти сборки фреймворка 2.0.5.0... - person benwasd; 24.09.2012
comment
это исправляет только проверку на машине разработки. нет? на клиентах была установлена ​​только .NET 4.0, моя целевая сборка PCL для .NET 4.0 все еще не может быть загружена. - person benwasd; 10.10.2012
comment
Этот ответ о SecAnnotate. Если сборка PCL не может быть загружена на 4.0, значит у вас нет microsoft.com/en-us/download/details.aspx?id=3556 установлен. См. раздел «Развертывание приложения .NET Framework» на этой странице: msdn.microsoft. .com/en-us/library/gg597391.aspx. - person David Kean; 10.10.2012
comment
@DavidKean Извините, я пропустил ваше обновление. По какой-то причине он не появился в моем почтовом ящике SO. Это работает отлично. СПАСИБО!!! - person Travis Illig; 29.03.2013

Mscorlib версии 2.0.5.0 упоминался в ранней версии PCL до VS2012.

Есть один ясный способ, как вы можете оказаться в зависимости от него. Если вы начали с загрузки Autofac-2.6.3.862-Portable.zip, вы получите версию Autofac.dll, которая действительно имеет зависимость от mscorlib версии 2.0.5.0. Что-то, что вы можете увидеть с помощью ildasm.exe, дважды щелкнув манифест:

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

Таким образом, каким-то образом ваша Autofac.Configuration.dll была создана из проекта, который ссылается на эту версию Autofac.dll, а не на ту, которую вы создали. Удалите эту ссылку из проекта. Используйте Project + Add Reference и вместо этого используйте вкладку Project, отметив свой проект Autofac.

person Hans Passant    schedule 11.09.2012
comment
Я думал, что там тоже должна быть старая ссылка, но я уже проверил - ее нет. Это все в одном большом решении, все ссылки на проекты. Тройная проверка. Вот почему это поставило меня в тупик. - person Travis Illig; 11.09.2012
comment
Я добавил дополнительную информацию к вопросу - появляются целевые платформы для сборки и ссылки, которые я вижу. - person Travis Illig; 11.09.2012