Ошибка чтения файла ресурсов для любого проекта WPF в VS2012

Всякий раз, когда я пытаюсь скомпилировать любой проект WPF в VS2012, у меня возникает следующая ошибка компиляции:

Ошибка чтения файла ресурсов 'c:\Users\mysuerID\Documents\Visual Studio 2012\Projects\MyAppNAme\MyAppNAme\obj\Debug\' - 'Системе не удается найти указанный путь. ' C:\Users\mysuerID\Documents\Visual Studio 2012\Projects\MyAppNAme\MyAppNAme\CSC MyAppNAme

Проблема в том, что когда VS генерирует команду CSC, она содержит дополнительный частичный дубликат / параметр ресурса, подобный этому:

/resource:obj\Debug\ /resource:obj\Debug\MyAppName.Properties.Resources.resources 

CSC просматривает только первый параметр и, так как имя файла не указано, выдает ошибку. Я перешел в режим командной строки и проверил с дополнительным параметром и без него и убедился, что это проблема. Я не хочу вручную компилировать свои проекты!

Кто-нибудь знает, как VS подходит к этим параметрам и как я могу избавиться от этого дополнительного недопустимого параметра?

Результат сборки выглядит следующим образом (Framework 4.5)

1>Target "MainResourcesGeneration" in file "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.WinFX.targets" from project "C:\Users\jws15592\Documents\Visual Studio 2012\Projects\MyAppName\MyAppName\MyAppName.csproj" (target "PrepareResources" depends on it):
1>Building target "MainResourcesGeneration" completely.
1>Input file "C:\Users\jws15592\Documents\Visual Studio 2012\Projects\MyAppName\MyAppName\obj\Debug\MainWindow.baml" is newer than output file "obj\Debug\".
1>Task "Message" skipped, due to false condition; ('$(MSBuildTargetsVerbose)'=='true') was evaluated as (''=='true').
1>Using "ResourcesGenerator" task from assembly "PresentationBuildTasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35".
1>Task "ResourcesGenerator"
1>  
1>  
1>  Microsoft (R) Build Task 'ResourcesGenerator' Version '4.0.30319.17929 built by: FX45RTMREL'.
1>  Copyright (C) Microsoft Corporation 2005. All rights reserved.
1>  
1>  
1>  Generating .resources file: 'obj\Debug\'...
1>C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.WinFX.targets(709,5): error RG1000: Unknown build error, 'Could not find a part of the path 'C:\Users\jws15592\Documents\Visual Studio 2012\Projects\MyAppName\MyAppName\obj\Debug\'.' 
1>Done executing task "ResourcesGenerator" -- FAILED.
1>Done building target "MainResourcesGeneration" in project "MyAppName.csproj" -- FAILED.

ItemGroup в файле проекта:

  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs">
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="Properties\Resources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <Compile Include="Properties\Settings.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <DesignTimeSharedInput>True</DesignTimeSharedInput>
    </Compile>
    <EmbeddedResource Include="Properties\Resources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
    <None Include="app.config" />
    <None Include="Properties\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    </None>
    <AppDesigner Include="Properties\" />
  </ItemGroup>

3 ответа

Решение

Это не дополнительный аргумент, это неполный аргумент. Обычно вы ожидаете увидеть /resource:obj\Debug\MyAppName.g.resources там. Что-то заставляет это имя файла переходить в пустую строку. Он генерируется из файлов.xaml в вашем приложении.

Инструменты + Параметры, Проекты и решения, Построить и запустить, параметр "Детализация сборки проекта MSBuild", измените его на "Подробный". Теперь вы получите очень подробную трассировку шагов сборки. Скопируйте / вставьте его в Блокнот и включите Формат + Перенос слов, чтобы вы могли видеть все.

Ожидаемый шаг сборки, который генерирует файл MyAppName.g.resources, выглядит следующим образом:

1>Output file "obj\Debug\MyAppName.g.resources" does not exist.
1>Task "Message" skipped, due to false condition; ('$(MSBuildTargetsVerbose)'=='true') was evaluated as (''=='true').
1>Using "ResourcesGenerator" task from assembly "PresentationBuildTasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35".
1>Task "ResourcesGenerator"
1>  
1>  
1>  Microsoft (R) Build Task 'ResourcesGenerator' Version '4.0.30319.17929 built by: FX45RTMREL'.
1>  Copyright (C) Microsoft Corporation 2005. All rights reserved.
1>  
1>  
1>  Generating .resources file: 'obj\Debug\MyAppName.g.resources'...
1>  Reading Resource file: 'C:\Users\hpass_000\AppData\Local\Temporary Projects\MyAppName\obj\Debug\MainWindow.baml'...
1>  Resource ID is 'mainwindow.baml'.
1>  Generated .resources file: 'obj\Debug\MyAppName.g.resources'.

Сравните это с вашим и расскажите нам, что вы видите по-другому.


ОБНОВЛЕНИЕ: очевидно, что этот шаг сборки идет не так по той же причине. Входной файл сформирован правильно. Я могу сузить его до переменной MSBuild, которая имеет пустую строку, это $(_ResourceNameInMainAssembly),

Объясняя, почему это намного сложнее, я не вижу ни одного сценария, где он мог бы быть пустым. Используйте текстовый редактор для просмотра C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.WinFx.targets. Часть файла, которая назначает переменную, выглядит следующим образом:

 <_ResourceNameInMainAssembly Condition="'$(UICulture)' == ''">$(AssemblyName).g.resources</_ResourceNameInMainAssembly>

 <_ResourceNameInMainAssembly Condition="'$(UICulture)' != ''">$(AssemblyName).unlocalizable.g.resources</_ResourceNameInMainAssembly>

Этот файл.targets имеет длину 42567 байт и датирован 06.06.12 на моей машине. У меня установлен.NET 4.5.

В качестве обходного пути вы можете символически связать ваш фактический файл ресурсов с "отсутствующим" resources.resources файл. Я столкнулся с той же проблемой и исправил ее, просто набрав следующую строку в командной строке с повышенными правами.

mklink c:\MySolution\MyLibrary\MyLibrary\Properties\Resources.resources c:\MySolution\MyLibrary\MyLibrary\Properties\Resources.Designer.cs

Это странно.

Я не знаю, есть ли какие-либо настройки, которые вы можете использовать непосредственно в IDE, которые могут повлиять на это странное поведение. После проверки параметров командной строки, как вы сделали, я бы испачкал руки и открыл файл проекта в каком-нибудь текстовом редакторе (например, в блокноте). Там я бы проверил все <ItemGroup> узлы с <EmbeddedResource> или же <Content Include="Something"> как дочерние элементы, пока виновник не найден. Другие файлы, которые вы должны проверить, это *.resx в папке Properties.

Надеюсь, поможет.

Другие вопросы по тегам