Ошибка чтения файла ресурсов для любого проекта 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.
Надеюсь, поможет.