Инициализаторы объектов С# и ошибка компилятора версии 2.0

У меня возникла проблема с настройкой одного из моих проектов в TeamCity (v4.0), особенно когда речь идет об использовании инициализаторов объектов.

Проект строится нормально, однако может показаться, что TeamCity преобразует файл сборки во что-то, что ему нравится (некоторая мутация MSBuild), и когда дело доходит до компиляции кода для части решения, он отказывается, когда видит инициализатор объекта.

В частности, ошибки:

[11:16:21]: ErrorView.xaml.cs(22, 187): error CS1026: ) expected
[11:16:21]: ErrorView.xaml.cs(22, 208): error CS0116: A namespace does not directly contain members such as fields or methods
[11:16:21]: ErrorView.xaml.cs(27, 16): error CS1518: Expected class, delegate, enum, interface, or struct
[11:16:21]: ErrorView.xaml.cs(35, 16): error CS1518: Expected class, delegate, enum, interface, or struct
[11:16:21]: ErrorView.xaml.cs(46, 91): error CS1031: Type expected
[11:16:21]: ErrorView.xaml.cs(46, 119): error CS0116: A namespace does not directly contain members such as fields or methods
[11:16:21]: ErrorView.xaml.cs(48, 17): error CS1022: Type or namespace definition, or end-of-file expected

Когда я углублюсь в это, может показаться, что проблема связана с преобразованием файла сборки в формат TeamCity с использованием CSC из каталога фреймворка v2.0.

Можно ли скомпилировать код с использованием инициализаторов объектов (функция .NET 3.0) с помощью компилятора .NET 2.0 (я бы предположил, что нет, хотя я могу что-то упустить), и если нет, то знает ли кто-нибудь способ заставить его использовать компилятор 3.0 (если он существует) или компилятор 3.5?

Для тех, кто заинтересован, выполняемая команда CSC:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE 
/reference:..\..\..\build\blah.Logging.dll /reference:..\..\..\build\blah.Presentation.Interfaces.dll 
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.VisualBasic.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationCore.dll" 
/reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll" 
/reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.Luna.dll" 
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll 
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll 
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.dll
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll 
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll 
/reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationProvider.dll"
/reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\WindowsBase.dll" /debug+ /debug:full /filealign:512 
/keyfile:..\..\..\resources\blah.snk /optimize- /out:obj\Debug\blah.dll 
/resource:obj\Debug\blah.UserInterface.Properties.Resources.resources
/resource:obj\Debug\blah.UserInterface.blah.exe.license /target:library 
/win32icon:blah.ico SignalStrengthIndicator.xaml.cs TrayNotifier.xaml.cs ConnectedView.xaml.cs ConnectionProgressView.xaml.cs NetworkPasswordView.xaml.cs 
TrayProgress.xaml.cs NetworkConnectionView.xaml.cs ClassFiles\NetworkTypeConverter.cs 
ClassFiles\SecurityImageConverter.cs ClassFiles\SecurityTooltipConverter.cs 
ClassFiles\SignalStrengthTooltipConverter.cs ClassFiles\SignalVisibilityConverter.cs 
ClassFiles\SynchronizedObservableCollection.cs ConnectionOption.xaml.cs 
DisconnectionProgressView.xaml.cs ErrorView.xaml.cs ..\..\..\config\assemblyversion.cs 
Properties\Resources.Designer.cs Properties\Settings.Designer.cs

Спасибо!

Обновление: я частично (читай: я недоволен этим) исправил проблему, изменив средство запуска сборки с Nant на средство выполнения команд - это просто выполнило файл сборки Nant, как это было задумано, без каких-либо манипуляций, хотя уровень обратной связи другой. Любые другие предложения будут оценены.


person Matthew Savage    schedule 17.12.2008    source источник


Ответы (2)


Используете ли вы средство запуска сборки sln2005? Это будет использовать 2.0 csc. Проверьте конфигурацию сборки и измените ее на бегун sln2008 (см. http://www.jetbrains.net/confluence/display/TCD4/3.Build+Runners). Это должно использовать компилятор 3.5.

Если вы используете средство запуска MSBuild, http://www.jetbrains.net/confluence/display/TCD4/MSBuild убедитесь, что вы установили номер версии 3.5 на странице конфигурации.

Изменить: после проверки NAnt см. http://www.jetbrains.net/confluence/display/TCD4/NAnt_

где написано: «По умолчанию задача NSBuild msbuild использует MSBuild 2.0 (из Microsoft .NET Framework 2.0), однако вы можете использовать MSBuild 3.5 (из Microsoft .NET Framework 3.5), если добавите свойство teamcity_dotnet_use_msbuild_v35 со значением true в свой msbuild в сценарии NAnt. Например: "

<msbuild project="SimpleEcho.v35.proj">
   <!-- this property enables MSBuild 3.5 -->
   <property name="teamcity_dotnet_use_msbuild_v35" value="true"/>
   ...
 </msbuild>
person Mike Two    schedule 17.12.2008
comment
Закрыть, но не цитировать решение :| На самом деле я использую файл сборки NAnt, но он вызывает некоторые задачи msbuild для определенных проектов — я еще немного посмотрю на это. Спасибо - person Matthew Savage; 17.12.2008
comment
Является ли путь к Nant.exe, который вы задали в средстве запуска сборки NAnt в TeamCity, тем же путем, который вы используете при использовании средства выполнения команд? - person Mike Two; 17.12.2008
comment
Неважно. Я нашел ответ в документах TeamCity и обновил свой ответ. - person Mike Two; 17.12.2008

Для сценария NAnt можно просто определить системное свойство teamcity_dotnet_use_msbuild_v35 в настройках конфигурации сборки ( http://www.jetbrains.net/confluence/display/TCD4/6.Properties+and+environment+variables), чтобы запустить msbuild 3.5.

С другой стороны, если для целевой платформы NAnt установлено значение net-3.5 (только для NAnt 0.86 beta 1), msbuild следует взять из папки .NET 3.5.

person Eugene Petrenko    schedule 30.12.2008