Сборка Nant с использованием ссылок на сборки .NET 4.5 (бета), несмотря на указание net-4.0

После установки .Net 4.5 Beta вывод моей сборки Nant завершился ошибкой:

"не удалось загрузить тип System.Runtime.CompilerServices.ExtensionAttribute" из сборки mscorlib, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089 '. "

потому что, как указано в этом вопросе, Атрибут ExtensionAttribute перемещен в mscorlib.dll из System.Core.dll. Таким образом, сборка nant включает сборки .net4.5, несмотря на то, что я указал целевую структуру в сценарии сборки nant следующим образом:

<property name="nant.settings.currentframework" value="net-4.0" />

В Visual Studio сборка работает нормально (создает .dll, не требующий .Net 4.5). Но мне нужна сборка для работы с nant, потому что у нас есть «старожилы», а также процессы сборки, использующие nant.

Что мне нужно добавить в мой сценарий сборки nant, чтобы сборка действительно соответствовала 4.0?


person DanO    schedule 16.08.2012    source источник


Ответы (3)


Вчера я установил VS 2012 бок о бок с VS 2010, и после перекомпиляции и развертывания веб-проекта он потерпел неудачу с тем же исключением. После часа исследований я нашел решение.

Во-первых, вам нужно отредактировать nant.exe.config

Откройте его и найдите:

<framework
   name="net-4.0" 

Это ок. в строке 555 (в конфигурации по умолчанию для NAnt 0.92)

Вы увидите огромный xml, описывающий компиляцию net-4.0. Найдите три дочерних <reference-assemblies> элемента. Первые два выглядят так

<reference-assemblies basedir="${path::combine(installRoot, 'v4.0.30319')}">
<reference-assemblies basedir="${path::combine(installRoot, 'v4.0.30319')}/WPF">

и третий

<reference-assemblies basedir="${environment::get-folder-path('ProgramFiles')}/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.0">

А теперь - просто отредактируйте первые два, чтобы они соответствовали третьему (скопируйте из третьего и вставьте-замените 1-й и 2-й). После этого NAnt будет искать все .dll в папке Reference Assemblies (вместо «сломанной» Windows / Microsoft .NET / ...)

Не беспокойтесь о суффиксе /WPF у второго - в Reference Assemblies все файлы находятся в одной папке, без подпапки / WPF.

Второй шаг - измените свой сценарий сборки

При вызове задачи csc добавьте два атрибута nostdlib и noconfig:

<csc target="..." output="..." nostdlib="true" noconfig="true" ...>

Это отключит автоматические ссылки на "плохой новый" mscorlib и другие библиотеки из папки csc.

А внутри элемента <references> - вручную добавить mscorlib.dll, system.core.dll и все используемые системные библиотеки. NAnt найдет их в Referenced Assemblies папке:

<references>
    <include name="mscorlib.dll"/>
    <include name="Microsoft.CSharp.dll"/>
    <include name="System.dll"/>
    <include name="System.Configuration.dll"/>
    <include name="System.Core.dll"/>
    ...

После этого (и, конечно, перестройки) мой сайт успешно запустился на хостинг-машине с "оригинальной" .NET Framework 4. :)

P.S. Похоже, Microsoft заново изобрела DLL АД :)

person Dmitry    schedule 30.08.2012
comment
Действительно, заново изобрел DLL АД! Спасибо, что нашли время опубликовать это! - person DanO; 05.09.2012
comment
Кажется, не работает с VB.Net, у которого нет опции noconfig в nant :( Я также пытался заставить это работать, используя библиотеки DLL, созданные через Studio, и это тоже не удается. :( - person Rory Becker; 13.09.2012
comment
Для компилятора Visual Basic флаги noconfig / nostdlib ведут себя по-другому, и, в частности, они не препятствуют связыванию с некоторыми стандартными библиотеками. К счастью, MS осознала эту проблему и добавила аргумент / sdkpath, который следует использовать вместо него. С nant я решил это, добавив это в задачу vbc: ‹arg line = / sdkpath: $ {environment :: get-folder-path ('ProgramFiles')} \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4. 0 / › - person Oskar Berggren; 11.11.2012
comment
Что, если наш сценарий nant просто вызывает MSBuild (target: Build) вместо прямого вызова CSC? - person Carl Bussema; 04.03.2013
comment
Если ваш сценарий nant вызывает MSBuild - тогда вся работа выполняется MSBuild, и он использует правильные сборки, как при сборке из Visual Studio. - person Dmitry; 06.03.2013

Возможно, вам придется сделать две вещи (я вообще не пробовал, но помню, что это помогло, когда была выпущена 4). Во-первых, измените nant.exe.config и добавьте версию к поддерживаемым версиям фреймворка в разделе запуска файла конфигурации (я думаю, что это то, куда они идут, это должно быть очевидно, как только вы его откроете). Затем обновитесь до последней и лучшей версии NaNT. А затем сделайте что-то вроде этого в своем файле сборки:

<property 
    name="assembly-location" value="${framework::get-assembly-directory('net-4.5')}" />
<property 
    name="dotNetReferenceAssemblyPath" value="${assembly-location}\" />

Опять же, прошло какое-то время, и я не уверен на 100%, что это сработает, но это может направить вас на верный путь.

person kprobst    schedule 16.08.2012

В принципе, решение Дмитрия правильное, но мне пришлось немного его изменить, прежде чем я смог скомпилировать сборки .Net 4.0 на моем Windows Server 2012. Я использовал последнюю версию nant-0.93-nightly-2013-10-20 в своей среде .

  1. В выходных данных сборки Visual Studio 2013 можно увидеть, что CSC выполняется с флагами / noconfig и / nostdlib + для цели .Net 4.0. Это доказывает, что ваше решение верное.

  2. basedir = "$ {environment :: get-folder-path ('ProgramFiles')} ..." у меня не сработало, потому что NAnt.exe - это 64-битный процесс. Фактически, большинство стандартных сборок доступны только в корне Program Files (x86). Я пробовал использовать corflagging NAnt.exe, но это вызвало другие проблемы. Чтобы гарантировать, что основные сборки могут быть обнаружены как 32-битными, так и 64-битными процессами, я создал каталог C: \ Nant \ Microsoft.Net \ v4.0 и скопировал их туда. Поскольку каталог не находится под Program Files, он всегда виден.

  3. Наш сценарий сборки NAnt огромен, и я не хотел вручную изменять ссылки для каждой задачи csc. Чтобы уменьшить количество необходимых модификаций скрипта, я немного настроил NAnt 0.93 nightly. Если имя целевой платформы - «net-4.0» и задача имеет тип CscTask, она автоматически добавляет mscorlib.dll, System.dll и все ссылки на сборку системы, найденные в csproj, расположенном в корневом каталоге источников задач csc. Исходный код и двоичные файлы настройки можно найти здесь: http://support.decos.nl/berend/NAnt-0.93-nightly-2013-10-20-modified.zip

Измененный код регистрирует добавленные ссылки на выходные данные сборки NAnt:

Inserted reference System.Data.dll
Inserted reference System.Xml.dll
Inserted reference System.configuration.dll
Inserted reference System.dll
Inserted reference mscorlib.dll
      [csc] Compiling 11 files to '...
person Berend Engelbrecht    schedule 26.03.2014
comment
Спасибо, что поделился! В итоге мы исправили nant практически идентичным способом, к сожалению, поскольку он был предназначен только для внутреннего использования, не было никакого интереса к выпуску наших исходных патчей. Подобные патчи для этой проблемы с Nant существуют и на github, но разработчики основного проекта их не вытащили и не интегрировали ... Печально видеть, что nant умирает вот так. - person DanO; 02.04.2014