В Visual Studio 2010 создается файл.NETFramework,Version=v4.0.AssemblyAttributes.cpp, и можно ли это отключить?

Я недавно обновил до Visual Studio 2010. Теперь, когда я строю проекты, я получаю строку, которая гласит:

1>  .NETFramework,Version=v4.0.AssemblyAttributes.cpp

Я узнал, что это результат нового движка сборки, msbuild.exe, но этот файл фактически создается автоматически и помещается в мой локальный временный каталог (c:\Documents and Settings\me\Local Settings\Temp). Кто-нибудь знает, почему этот файл создан, и могу ли я отключить его создание?

Кстати, мне кажется, в этом нет ничего полезного. Увидеть ниже:

#using <mscorlib.dll>
[assembly: System::Runtime::Versioning::TargetFrameworkAttribute(L".NETFramework,Version=v4.0", FrameworkDisplayName=L".NET Framework 4")];

И иногда, как сообщалось http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/15d65667-ac47-4234-9285-32a2cb397e32, это вызывает проблемы. Поэтому любая информация об этом файле и о том, как я могу избежать его автоматического создания, будет высоко оценена. Спасибо!

6 ответов

Решение

Это общее для всех языков (в C#, VB и F# тоже есть что-то похожее).

Один из способов отключить его - переопределить цель GenerateTargetFrameworkMonikerAttribute следующим образом:

<!-- somewhere after the Import of Microsoft.somelanguage.targets -->
<Target Name="GenerateTargetFrameworkMonikerAttribute" />

в вашем файле проекта.

Взгляните на c:\program files\msbuild\microsoft.cpp\v4.0\microsoft.buildsteps.targets. Он содержит цель GenerateTargetFrameworkMonikerAttribute, которая генерирует файл. Элемент Condition определяет, когда он выполняется, значение GenerateTargetFrameworkAttribute является значением. Это всегда будет верно, если в настройках проекта запрашивается сборка / clr. Комментарий в цели очень вводит в заблуждение, шумиха по поводу предварительно скомпилированных заголовочных файлов не имеет ничего общего с целью цели.

[TargetFrameworkAttribute], который он генерирует в вспомогательном файле.cpp, важен, он сообщает CLR на машине, на которой запускается программа, какая минимальная версия.NET должна присутствовать для успешного выполнения программы. Его основное назначение - автоматический запуск установщика нужной версии.NET, очень приятная функция.

LNK4221 распространен и не имеет зубов, его можно игнорировать. К сожалению, компоновщик не обеспечивает документированный способ подавления предупреждений, основная проблема заключается в том, что он не может быть достаточно конкретным, чтобы подавлять только это. Подавление вспомогательного файла.cpp потребует редактирования файла.targets и нарушения функции автоматической установки, я не могу этого рекомендовать.

Я решил эту проблему с помощью следующих шагов:

  1. Чистый раствор
  2. Закройте решение
  3. Введите команду запуска %temp%удалите все файлы
  4. Откройте решение, щелкнув файл решения проекта в папке, в которой был сохранен проект.
  5. Перестройте один из проектов. Затем закройте Visual Studio 2010 (да, всю среду разработки), а затем снова откройте файл решения.

    Похоже, что при восстановлении воссоздается отсутствующий файл, но Visual Studio этого не замечает, поэтому вам нужно закрыть его и открыть заново, чтобы он снова правильно увидел файл.

Во-первых, ответ @Brian исправляет состояние, и я дал 4x+1 для других полезных ответов, которые помогли в быстрой диагностике и решении проблемы, с которой я столкнулся.

Хотел включить дамп проблемы, которую я диагностировал в моем контексте, основываясь на этом.

Эта функция синтезирует исходный файл на языке проекта, который создает assembly:атрибут в поток компиляции.

Этот файл / процесс необходим, когда WAS или другие хостинговые среды должны иметь возможность определять целевую среду и другие подобные случаи. Пример статьи MSDN (касающийся использования с WAS). Это только атрибут, поэтому он инертен и не о чем беспокоиться...

В случаях, когда такая уверенность не вступит в игру, это становится более интересным. Помимо избыточности, создания больших двоичных файлов и нагрева процессора, в TeamCity процедуры очистки при настройке для инкрементных сборок удаляют этот файл перед повторной сборкой. Однако, к сожалению, побочным эффектом является то, что проверка зависимостей сборки неверно делает вывод о необходимости перестройки, как показано в этом примере сообщения при включении регистрации с указанием /v:d[Etailed]: -

[CoreCompile] Входной файл "C:\BuildAgent\temp\buildTmp.NETFramework,Version=v4.0,Profile=Client.AssemblyAttributes.cs" новее, чем выходной файл "bin\Debug\DLLNAME.xml".

Суть в том, что CSC вызывается ненадлежащим образом (и в нашем случае от этого происходят существенные последующие эффекты)

Другие заметки:

  • Нужно заглянуть в MS Targets, чтобы увидеть, относится ли это только к конкретным профилям [как указано в ответе @AlainA] (мой конкретный случай - использование клиентского профиля.NET 4.0).

  • Как показано в приведенном выше сообщении, одна тонкость, которая может быть связана с этим, заключается в наличии или отсутствии документов XML, что имеет место в моем контексте.

Закрыть VS

Откройте каждый файл.vbproj с помощью блокнота и удалите следующую строку:

Все кончено!

Файл предназначен для встраивания атрибута сборки.NET TargetFrameworkMoniker. То есть (в будущем) поможет хостам корректно работать с соответствующим CLR. (Извините за неопределенность, я не могу вспомнить, чтобы кто-то еще был экспертом). То есть, на самом деле есть причина для этого:-)

Я не знаю, почему есть предупреждение - изучать его.

Dan / MSBuild

Другие вопросы по тегам