Вчера я установил 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