Не удалось загрузить файл или сборку из SatelliteResourceMismatchRule.

Недавно мы обновили наши проекты C# с .NET 3.5 до 4.0. Мы запускаем Gendarme на наших локальных машинах и в CC.NET. После обновления всех наших проектов Жандарм получает эту ошибку для одной из наших сборок (с включенным ведением журнала):

An uncaught exception occured. Please fill a bug report at https://bugzilla.novell.com/
Rule:   Gendarme.Rules.Globalization.SatelliteResourceMismatchRule
Target: Core.UI, Version=27.0.0.0, Culture=neutral, PublicKeyToken=null
Stack trace: System.IO.FileNotFoundException: Could not load file or assembly 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
File name: 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
  at System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, BooleanloadTypeFromPartialName)
  at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
  at System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
  at System.Type.GetType(String typeName, Boolean throwOnError)
  at System.Resources.ResourceReader.FindType(Int32 typeIndex)
  at System.Resources.ResourceReader.DeserializeObject(Int32 typeIndex)
  at System.Resources.ResourceReader.LoadObjectV2(Int32 pos, ResourceTypeCode& typeCode)
  at System.Resources.ResourceReader.GetValueForNameIndex(Int32 index)
  at System.Resources.ResourceSet.ReadResources()
  at Gendarme.Rules.Globalization.SatelliteResourceMismatchRule.CheckSatelliteResource(EmbeddedResource mainResource, EmbeddedResource satelliteResource, IMetadataTokenProvider satelliteAssembly)
  at Gendarme.Rules.Globalization.SatelliteResourceMismatchRule.CheckSatelliteAssembly(AssemblyDefinition satellite)
  at Gendarme.Rules.Globalization.SatelliteResourceMismatchRule.CheckAssembly(AssemblyDefinition assembly)
  at Gendarme.Framework.Runner.OnAssembly(RunnerEventArgs e)
  at Gendarme.ConsoleRunner.OnAssembly(RunnerEventArgs e)
  at Gendarme.Framework.Runner.Run()
  at Gendarme.ConsoleRunner.Run()
  at Gendarme.ConsoleRunner.Execute(String[] args)

=== Pre-bind state information ===
LOG: DisplayName = System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///c:/sd/trunk/bin/prod/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config.
LOG: Post-policy reference: System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: Attempting download of new URL file:///c:/sd/trunk/bin/prod/System.Drawing.DLL.
LOG: Attempting download of new URL file:///c:/sd/trunk/bin/prod/System.Drawing/System.Drawing.DLL.
LOG: Attempting download of new URL file:///c:/sd/trunk/bin/prod/System.Drawing.EXE.
LOG: Attempting download of new URL file:///c:/sd/trunk/bin/prod/System.Drawing/System.Drawing.EXE.

Одна и та же ошибка возникает на нескольких компьютерах. Gendarme отлично работает с другими сборками, которые ссылаются на System.Drawing, а также со сборками, которые ссылаются на сломанную. Я создал файл конфигурации для жандарма и указал .NET 4.0, но все равно получаю ту же ошибку. Я удалил ссылку и добавил ее снова без изменений. Если я запускаю нашу программу, элементы управления в этой сборке загружаются и работают без проблем. У нас есть модульные тесты в этой сборке, и NUnit и PartCover также работают нормально.

Я заметил, что он использует файл machine.config из папки Framework64\v2.0.50727, но я не понимаю, чем эта сборка отличается от других. Может ли это быть проблемой? Что еще я могу попробовать?


person DSway    schedule 06.07.2011    source источник


Ответы (2)


В целом не имеет значения, какую версию фреймворка вы анализируете, т.е. Gendarme поддерживает их все. Однако в этом случае правило пытается загрузить данные из ресурсов, для десериализации которых требуется версия .NET (4.0), отличная от исполняемой Gendarme (3.5).

Это ошибка в самом правиле, и ее необходимо исправить (пожалуйста, откройте отчет об ошибке, как указано в сообщении об ошибке). А пока исключите это правило (полностью или по какой-либо сборке/типу/методу) из своего анализа.

person poupou    schedule 16.07.2011
comment
Спасибо за ваш ответ. Теперь это регистрируется здесь. - person DSway; 18.07.2011

К вашему сведению: у меня была та же проблема, что и у вас; однако мне удалось запустить жандарм в сонаре, установив самую последнюю версию моментального снимка: https://github.com/spouliot/gendarme/downloads (сейчас это gendarme-2.11-snapshot-20110305-win32-setup.zip)

Обязательно укажите путь установки в файле sonar-project.properties:

sonar.gendarme.installDirectory=C:/Program Files/Жандарм/

person John M. Wright    schedule 22.11.2011