Подтвердить что ты не робот

SGEN: Была сделана попытка загрузить сборку с неправильным форматом

У меня есть проект, который может прекрасно работать на моем локальном компьютере, однако, когда я получаю TFS для его создания, я получаю следующую ошибку:

SGEN: Была сделана попытка загрузить сборку с неправильным форматом:

После прочтения многих других сообщений здесь, в этой теме, большинство людей просто говорят, что мне нужно изменить тип сборки на x86 или Any CPU, а не на x64, но после попытки бесчисленных комбинаций это не было решением. Моя программа также является службой Windows, поэтому настройка пула приложений для 32-разрядных приложений (как это предлагают другие) также не является решением.

4b9b3361

Ответ 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

Ответ 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