SGEN: Была сделана попытка загрузить сборку с неправильным форматом
У меня есть проект, который может прекрасно работать на моем локальном компьютере, однако, когда я получаю TFS для его создания, я получаю следующую ошибку:
SGEN: Была сделана попытка загрузить сборку с неправильным форматом:
После прочтения многих других сообщений здесь, в этой теме, большинство людей просто говорят, что мне нужно изменить тип сборки на x86 или Any CPU, а не на x64, но после попытки бесчисленных комбинаций это не было решением. Моя программа также является службой Windows, поэтому настройка пула приложений для 32-разрядных приложений (как это предлагают другие) также не является решением.
Ответы
Ответ 1
Моя проблема была окончательно решена на этой странице - http://aplocher.wordpress.com/2012/10/12/sgen-an-attempt-was-made-to-load-an-assembly-with-an-incorrect-format-tfs-2010/
На всякий случай, когда эта страница когда-либо исчезнет в будущем, выполните следующие действия:
- В Team Explorer щелкните правой кнопкой мыши по определению сборки и выберите Open Process File Location
- Дважды щелкните по выбранному XAML файлу
- В конструкторе выберите контейнер под названием Sequence (это контейнер верхнего уровня, который обойдет все остальное).
- В списке Аргументов (обычно внизу) измените MSBuildPlatform от Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.Auto к Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.X86.
- Сохраните и закройте файл.
- Проверьте файл обратно в TFS и повторите попытку.
Ответ 2
Проблема исчезает после установки последнего Windows SDK, который включает 64-разрядную версию sgen.exe:
http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx
Иногда (если это не помогает) более старая версия помогает:
http://msdn.microsoft.com/en-us/windows/desktop/hh852363.aspx
По какой-то причине 64-разрядная версия sgen не включена в Microsoft Build Tools
Ответ 3
Я столкнулся с той же ошибкой, когда попытался скомпилировать мой проект (целевая платформа платформы установлена в x86) в Release. Он отлично компилируется в Debug. Я пришел, чтобы узнать, что в Release запускается сборка сериализации; следовательно, вызов утилиты SGen. Проблема заключалась в том, что MSBuild назвал x64 версию SGen против моего x86 EXE, которая сгенерировала ошибку. Мне пришлось передать этот аргумент MSBuild, чтобы MSBuild использовала правильную версию SGen:
/p:SGenToolPath="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools"
Ответ 4
Я нашел этот вопрос соответствующим: https://github.com/dotnet/sdk/issues/1630
В ожидании исправления в следующей версии я смог решить эту проблему, добавив две цели в файл csproj, как предложено https://github.com/joperezr:
<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Remove="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
</ItemGroup>
<Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." />
</Target>
<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
</ItemGroup>
<Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has run." />
</Target>
Ответ 5
В моем случае эта ошибка возникла из-за недействительной комбинации настроек x86/x64, но из-за попытки создать проект, ориентированный на определенную версию .NET framework (v4.5.1), чьи ссылочные сборки не были установлены на сервер сборки.
Сочетание следующих двух условий отвечало за ошибку:
- В Visual Studio на странице "Свойства проекта" на вкладке "Приложение" в "Целевой структуре" была установлена ".NET Framework 4.5.1";
- На сервере сборки в папке
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework
папка с именем v4.5.1 отсутствовала. (Другие папки с номерами версий, включая v3.5, v4.0 и v4.5, присутствовали.)
Исправление заключалось в установке пакета разработки Windows (SDK) для Windows 8.1 на сервере сборки. В мастере установки в шаге "Выберите функции, которые вы хотите установить" я снял флажки без полей, кроме одного для ".NET Framework 4.5.1 Software Development Kit".
Запуск этой установки вызвал исчезновение папки v4.5.1 в папке Reference Assemblies\Microsoft\Framework.NETFramework и сборка для успешного запуска.
Ответ 6
У меня была такая же проблема, и просмотр экрана вывода дал мне больше деталей. Из этого я обнаружил, что Target Framework была выше, чем было разрешено для этого типа проекта (я строил проект CLR SQL Server). Целевая структура проекта была установлена в 4.0. Изменение этого вопроса до 3.5 исправило проблему для меня.
Dave
Ответ 7
Я обновил проект с 4.0 до 4.5.2 и установил Microsoft.NET Framework 4.5.2 Developer Pack на сервер сборки. После этого это сработало. У вас есть пакет разработчика для всех остальных версий .net.
https://support.microsoft.com/en-us/help/2901951/the-microsoft--net-framework-4-5-2-developer-pack-for-windows-server-2
Ответ 8
У меня была похожая проблема: я видел ошибку SGEN "неправильный формат" при сборке в VS или MSBuild из командной строки. Мой проект x64, но MSBuild настаивал на использовании 32-битной версии инструмента. (Некоторые из моих коллег работают над этим, собираясь в VS 2015, но у меня установлена только VS 2017, и я хочу сохранить его таким.)
Глядя на вывод диагностической сборки, похоже, что SGEN работает из каталога, названного его параметром SdkToolsPath (для меня: C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\
). Это назначено из TargetFrameworkSDKToolsDirectory. Глядя на файлы целей, это происходит из SDK40ToolsPath. И это устанавливается из файла MSBuild.config.
Я решил эту проблему, отредактировав C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe.config
(требуется привилегия администратора), установив свойство SDK40ToolsPath с помощью
<property name="SDK40ToolsPath" value="$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.6.2\WinSDK-NetFx40Tools-x64', 'InstallationFolder', null, RegistryView.Registry32))" />
(Примечание. Если вы ищете этот путь в реестре в 64-разрядной ОС, перейдите по адресу HKLM\SOFTWARE\WOW6432Node\Microsoft...)
Основное изменение, конечно, с x86 на x64 - использование 64-битных инструментов. Я также изменил структуру на то, что мы используем (4.6.2). Это может означать, что мы можем надежно использовать инструменты только для 64-битных проектов и для этой среды, с учетом этого изменения. Тем не менее, я надеюсь, что это может помочь кому-то столкнуться с этой проблемой. (Я шокирован и встревожен MSBuild не меняет автоматически путь инструментов на основе Framework & Architecture.)
Ответ 9
У нас была эта ошибка, и единственное, что сработало, - это начать с нового клона нашего исходного кода в новую папку, после выравнивания всех наших проектов с AnyCPU (один был установлен на x64). Выровняв это так, что все они были AnyCPU, не справились с задачей самостоятельно.
Мы думаем, что где-то на наших машинах сборки .Net или Visual Studio кэшировали другую версию/формат System.Buffers.dll для одного из наших проектов, который нам не удалось очистить. Создание чистой копии нашей кодовой базы, казалось, обошло это.
Ответ 10
В моем случае решение правильно скомпилировано в Debug, но была ошибка Release только в одном проекте.
Использование этого https://social.msdn.microsoft.com/Forums/en-US/13d3cc7a-88dc-476c-8a15-fa2d4c59e5aa/sgen-an-attempt-was-made-to-load-an-assembly-with- an-неправильный формат? forum = netfx64bit, я изменил проект PlatformTarget, который был с проблемами x86 для любого процессора.
Я поддерживал решение с помощью Mixed Platform, и его можно было скомпилировать в Release