MissingManifestResourceException при запуске тестов после сборки с помощью MSBuild (.mresource имеет путь в манифесте) - PullRequest
3 голосов
/ 16 августа 2011

У меня проблема со встроенными ресурсами для проекта C # на сервере сборки с использованием MSBuild в командной строке. Проект отлично работает при сборке и запуске тестов в Visual Studio, но при запуске MSBuild из командной строки при запуске теста возникают следующие проблемы:


System.Resources.MissingManifestResourceException: не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что ".Properties.Resources.resources" был правильно внедрен или связан со сборкой "" во время компиляции, или что все требуемые спутниковые сборки загружаемы и полностью подписаны.

System.Resources. запрашиваемая культура, логическое createIfNotExists, логическое tryParents, StackCrawlMark & ​​stackMark) в System.Resources.ResourceManager.InternalGetResourceSet (CultureInfo culture, логическое createIfNotExists, логическое tryParents) в System.Resources.ResourceStribution_resource_ringeryomeringGringer) () в \ Properties \ Resources.Designer.cs: строка 87


Я отследил проблему до сгенерированного IL (я использую ildasm). При сборке в Visual Studio в манифесте сборки указывается следующее:

.mresource public <PROJECTNAME>.Properties.Resources.resources
{
  // Offset: 0x00000000 Length: 0x00000236
}

но при сборке с использованием MSBuild генерируется следующий вывод:

.mresource public '../..//Build/<PROJECTNAME>_AnyCPU_Debug_Obj/<PROJECTNAME>.Properties.Resources.resources'
{
  // Offset: 0x00000000 Length: 0x00000236
}

поскольку можно увидеть, что путь к ресурсу внезапно становится частью имени ресурса.

У кого-нибудь есть идеи, как это исправить?

1 Ответ

8 голосов
/ 17 августа 2011

Похоже, добавление LogicalName в файл проекта исправляет это:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

т.е. поэтому встроенная запись ресурса в файле проекта выглядит следующим образом:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>

Это подробно описано в: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Обратите внимание, что мы используем файл .resx, но ошибка все еще появляется.

...