MSBuild Использование неправильной версии сборки для компиляции файла RDLC
Я использую элемент управления reportviewer из VS 2010 для создания отчетов на стороне клиента (rdlc). Все работает отлично на моей машине разработки, и когда я вручную компилирую (через VS2010) и вручную развертываю на тестовой машине, на которой не установлены средства разработки.
Чтобы заставить тестовую машину работать (без установки VS2010 или ReportViewer.exe), мне пришлось добавлять ссылки в моем проекте в Microsoft.ReportViewer.Winforms, Microsoft.ReportViewer.Common и Microsoft.ReportViewer.ProcessingModel и имеют все они "Копировать локальные".
У меня есть файлы rdlc, настроенные для Build Action = > встроенных ресурсов. Это значение по умолчанию при добавлении нового проекта rdlc в проект. Я открыт для настройки этого в противном случае, если это разрешит эту проблему (не знаю, связано ли это).
Проблема: с момента добавления файлов rdlc решение больше не строится на сервере сборки. Я установил ReportViewer.exe на сервер сборки и проверил, что необходимые сборки существуют в GAC. Рамка .Net 4 НЕ установлена на сервере сборки - я не думаю, что это требуется, потому что решение нацелено на 3.5 runtime.
Я считаю, что корень проблемы следующий из журнала сборки:
Цель "RunRdlCompiler": создание цели "RunRdlCompiler" полностью. Выходной файл "obj\Release\RdlCompile.compiled" делает не существует. Использование задачи "RdlCompile" от сборки "Microsoft.ReportViewer.Common, Версия = 9.0.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a". Задача "RdlCompile": Report\RDLC\GreenReport.rdlc(0,0): Ошибка rsInvalidReportDefinition: определение отчета недействительно. Подробности: определение отчета имеет недопустимое пространство имен задач 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' который не может быть обновлен.
Из того, что я могу сказать, Microsoft.ReportViewer.Common версии 10.0.0.0 является тем, что следует использовать для "компиляции" rdlc, но MSBuild, похоже, использует 9.0.0.0. Я считаю, что если бы я мог заставить его использовать правильную версию (которая установлена в GAC), решение будет компилироваться.
Ответы
Ответ 1
Это связано с тем, что ваш файл Microsoft.Common.Targets указывает на версию сборки версии 9.0.
Если вы посмотрите в [sysdir]\Microsoft.NET\Framework\v3.5, вы найдете Microsoft.Common.targets
, который управляет большим количеством того, что делает MSBuild. Этот пример файла общих целей указывает на [Program Files]\MSBuild\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets
, заставляя MSBuild работать с версией 9.0.
Когда вы установили .NET 4.0, вы получили новый файл общих целей в каталоге v4.0.x, этот новый теперь указывает на [Program Files]\MSBuild\Microsoft\VisualStudio\v10.0\ReportingServices\Microsoft.ReportingServices.targets
, который указывает на 10.0 версию сборщиков ReportViewer.
10.0 ReportViewer скомпилирован против .NET 3.5 и предназначен для работы как в версиях 3.5, так и 4.0. Вероятно, вы наверняка избавитесь от платформы .NET 4.0 и измените файл 3.5 общих целей, чтобы указать на новый целевой файл ReportingServices, и он должен работать. В любом случае, я никогда не пробовал. Вам может быть лучше всего придерживаться 4.0, как и то, что мы намеревались, когда мы разработали поддержку MSBuild для нового зрителя.
Ответ 2
Просто установите Microsoft Report Viewer 2010 SP1.
Ответ 3
У меня была очень похожая проблема. Просто внезапно я больше не мог строить VS2010-проект, содержащий файл .rdlc. Я не конвертировал отчеты или использовал сервер отчетов, все было локально. Я попытался создать совершенно новый проект и добавить пустой новый отчет rdlc и создать сборку, и это не сработает. Только однажды он прекратил компиляцию и дал мне следующую ошибку:
The report definition is not valid. Details: The report definition has an invalid target namespace 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' which cannot be upgraded.
Оказывается, проблема в том, что файл "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\ReportingServices\Microsoft.ReportingServices.targets" каким-то образом изменился. В верхней части моего файла было:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
И это должно было быть:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
Я изменил эту строку "Использование задачи" в файле, и все снова построено. ДЕЙСТВИТЕЛЬНО расстраивает, и он съел два дня моей жизни. Надеясь, что публикация этого комментария может помочь кому-то еще в подобной ситуации.
Джим Лафлер
Ответ 4
Я попытался переустановить все, и он не работал. Затем я попробовал обновить Microsoft.ReportingServices.targets согласно сообщению Jim, но даже не работал у меня.
В конце я просто скопировал Microsoft.ReportingServices.targets с другого компьютера (где он работал без ошибок). И удивительно, что он работает.
Дополнительная разница, которую я заметил при сравнении, чтобы изменить PublicKeyToken и Версия.
Это может быть только для меня, но сообщение Джима было очень полезно.
SFUH
Ответ 5
Оказывается, мне нужна была .Net 4.0 Framework, а точнее версия 4.0x MSBuild, в которой используется более новая версия библиотеки Microsoft.ReportViewer.Common.
Итак, даже если вы настроите таргетинг на фреймворк 3.5, если вы создадите rdlc с VS2010, он будет "скомпилирован" с использованием 4.0 инструментов.
Ответ 6
У меня та же проблема: мы используем ReportViewer 2012 (версия сборок начинается с 11). На локальных машинах и на сборке установлены пакет ReportViewer 2012 и VisualStudio 2013. На компиляции локальных машин в VS успешно, но на машине сборки во время сборки в очереди MSBuild выдает такую ошибку:
The report definition is not valid. Details: The report definition has an invalid target
namespace 'http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition'
which cannot be upgraded.
Я попытался изменить версию Microsoft.Common.targets из папки .NET 3.5, которая описана в этом сообщении, но без эффекта. Затем я открыл Microsoft.Common.targets из папки .NET 4.0 и нашел там такие строки:
<!-- VS10 without SP1 and without VS11 will not have VisualStudioVersion set, so do
that here -->
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)'
==''">10.0</VisualStudioVersion>
</PropertyGroup>
Тогда я понял, что проблема может быть в некорректном значении переменной $(VisualStudioVersion), поэтому я добавил, чтобы построить определение в разделе "Обработать" этот параметр MSBuild:
/p:VisualStudioVersion=12.0
И это сработало! Построение завершено успешно.
Надеюсь, это поможет кому-то.
Ответ 7
Вставка путей к файлам, похоже, не проходит... как насчет этого:
Был:
TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.Common, Version=8.0.0.0...
И теперь:
TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.WebForms, Version=10.0.0.0...
Джеймс
Ответ 8
NetFx40_LegacySecurityPolicy была включена в моем файле devenv.exe.config, и когда я прокомментировал эту строку, проект был успешно выполнен.
Мы включили устаревшую политику безопасности в нашу команду, чтобы наша команда могла работать с элементами управления DevExpress 7.2 из Visual Studio 2010, но в этом случае она показывает, что подход, который мы использовали, не всегда лучший.
Ответ 9
Я потерял 2 полных дня разработки из-за аналогичной проблемы. При создании моего проекта это будет успешным, но при восстановлении он не удался без ошибок. При исследовании журнала подробных построений в окне "Выход" он направил меня на проблему с функцией rdlcompile (так что проблема локализации отчетов служб отчетов). После того, как я попытался все, что мне удалось решить, я отключил свой антивирус. Антивирус как-то мешал моему восстановлению и заставлял перестроить сбой.
После отключения проверки на вирусы работы по восстановлению 100%
Ответ 10
У меня такая же проблема на моей Visual Studio 2013.
Версия службы отчетов dll для моего проекта: Version = 10.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a
Когда я проверил цели ReportingServices
C:\Program Files\MSBuild\Microsoft\VisualStudio\v12.0\ReportingServices\Microsoft.ReportingServices.targets
Я нашел версию задачи 11.0.0.0
<UsingTask TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
Когда я изменил версию задачи на 10.0.0.0, соответствующую версии dll на моем proejct.
<UsingTask TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
Это сработало.