Пакет Microsoft.Bcl с использованием CallerMemberName не удается собрать в Teamcity

Я взял на себя проект, ориентированный на .net4.

Один из проектов в рамках решения использует System.Runtime.CompilerServices.CallerMemberNameAttribute из System.Runtime.dll, которая устанавливается при использовании пакета Microsoft BCL Portability Pack.

Я проверил, и проект в настоящее время использует версию 1.1.3.

Когда решение собирается на локальных машинах разработки, все компилируется без проблем.

Сейчас я пытаюсь собрать решение в teamcity, но когда TeamCity пытается скомпилировать решение, я получаю эту ошибку. ошибка CS0246: тип или имя пространства имен «CallerMemberName» не может быть найден (вам не хватает директивы using или ссылки на сборку?) ошибка CS0433: тип «System.Runtime.CompilerServices.CallerMemberNameAttribute» существует как в «c:\Windows \Microsoft.NET\Framework\v4.0.30319\mscorlib.dll" и "c:\apps\teamcity\buildAgent\work\bb8aacaa9fabeac8\packages\Microsoft.Bcl.1.1.3\lib\net40\System.Runtime.dll"

Я прочитал ответ Джона Скитса на этот вопрос: Использование атрибута CallerMemberName в переносимой библиотеке Но я уже использую библиотеку BCL.


person Darren Guy    schedule 05.06.2014    source источник
comment
Использование сборок в c:\windows\microsoft.net — очень и очень серьезная ошибка. Они больше не подходят для использования в качестве надлежащих эталонных сборок, поскольку они не могут быть нацелены на конкретную версию .NET 4.x. Вы должны использовать сборки из каталога c:\program files\reference, выбирая правильный набор, соответствующий версии вашей целевой платформы. Невыполнение этого требования приводит к хаосу, ошибки сборки и выполнения могут быть очень трудно диагностировать. В частности, .NET 4.5.x очень несовместим с .NET 4.0.   -  person Hans Passant    schedule 09.06.2014
comment
Это часть проблемы. Этот проект по-прежнему нацелен на .net 4. После установки Microsoft.Bcl я проверил, и ссылка на System.Runtime.dll ссылается на D:\Projects\website\packages\Microsoft.Bcl.1.1.9\lib\net40. \System.Runtime.dll. Я не ссылаюсь на какую-либо dll непосредственно в папке c:\windows\microsoft.net. Поэтому я не понимаю, почему, когда TeamCity компилирует проект, он выдает мне ошибку   -  person Darren Guy    schedule 18.06.2014
comment
@DarrenGuy У меня была похожая ошибка; в моем файле packages.config версия Microsoft.Bcl была 1.1.10, но если я проверил путь к файлу ссылки на проект, на самом деле использовалась более ранняя версия Bcl. Удаление и восстановление пакета NuGet устранило ошибку. К сожалению, я не знаю, как вообще запуталась ссылка на проект, поэтому я не хочу публиковать это как возможный ответ.   -  person GrahamMc    schedule 07.12.2016


Ответы (1)


Потратив на это некоторое время, я нашел еще один вопрос, на который ответил Джон Скит, который решил эту проблему. Когда мы должны использовать ключевое слово extern alias в C#?

В моем проекте, после получения ссылок на Пакет, для каждой dll мне пришлось изменить имя псевдонима. т.е. от глобального к новому глобальному

Затем в классах, которые использовали CallerMemberName, нужно было сделать следующее. В верхней части страницы над операторами использования

внешний псевдоним newglobal;

А затем при обращении к CallerMemberName введите код как

[newglobal::System.Runtime.CompilerServices.CallerMemberName]

Это позволяет успешно собрать код в teamcity, где установлен .net 4.5.

person Darren Guy    schedule 09.06.2014