Служба Windows создает исключение System.BadImageFormatException в Windows Server 2008, x64, .NET 4, перенесенных с 3.5 - PullRequest
5 голосов
/ 23 июля 2010

Я попытался скомпилировать служебный EXE-файл как AnyCPU, x86 и x64.Это работает на моем Windows 7 x64 box.Я устанавливаю с помощью installutil, версия .NET 4.

При запуске службы выдается ошибка.Он ничего не говорит, но указывает на то, какие модули загружены.Потенциальный интерес:

LoadedModule [0] = D: \ yellowbook \ grapevine_service \ grapevinesystemservice.exe LoadedModule 3 = C: \ Windows \ system32 \ KERNEL32.dll LoadedModule 4 = C: \ Windows \ system32 \ KERNELBASE.dll LoadedModule [9] = C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ mscoreei.dll LoadedModule [17] = C: \ Windows \Microsoft.NET \ Framework64 \ v2.0.50727 \ mscorwks.dll LoadedModule [18] = C: \ Windows \ WinSxS \ amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_88dce9872fb \80_c_80_c_80_c_c_c_c_c_c_64_c_c_64_c_c_64_c_c_64_c_c_64_c_c_2_c_2_c_2_64_c_p_0_2_символахNativeImages_v2.0.50727_64 \ mscorlib \ 9a017aa8d51322f18a40f414fa35872d \ mscorlib.ni.dll

Я могу запустить эту службу как консольное приложение с параметром командной строки, который выдает следующее:

Необработанное исключение: System.BadImageFormatException: Не удалось загрузить файл или сборку 'grapevinesystemservice.exe' или одну из ее зависимостей.Эта сборка создается средой выполнения, более новой, чем текущая загруженная среда, и не может быть загружена.Имя файла: 'grapevinesystemservice.exe'

Я пытался взломать реестр, чтобы принудительно использовать последнюю среду выполнения.Нет эффекта.Я посмотрел на установленный EXE-файл в отражении, чтобы убедиться, что он не был испорчен моим сервером сборки, но он нацелен на 4.0.30319.Мой локальный, сборочный и тестовый сервер имеют версию 30319 в качестве версии .NET 4.Ни у кого никогда не было бета / RC.

Они не были перечислены в загрузочных модулях, но я также использую log4net (перестроен в .NET 4 из исходного кода), StructureMap , NoRM ( MongoDB ), AutoMapper , Newtonsoft.Json и ряд других файлов DLL, созданных моей командой.

Ответы [ 4 ]

6 голосов
/ 23 июля 2010

Вы пробовали установить значение requiredRuntime в файле конфигурации для grapevinesystemservice.exe?Как упомянуто 0xA3, похоже, что он не настроен на использование 4.0.

<startup>
  <requiredRuntime version="v4.0.20506" safemode="true"/>
</startup>
3 голосов
/ 23 июля 2010

Один из ваших зависимых файлов DLL не был скомпилирован с AnyCPU .См. Вопрос переполнения стека Как определить, была ли построена сборка .NET для x86 или x64? , чтобы узнать, как их проверить.

1 голос
/ 09 июня 2011

Я также видел вышеуказанную проблему при установке службы с помощью installutil. Проблема заключалась в том, что я установил .NET 4 Framework, используя dotNetFx40_Full_setup.exe из MSFT. Установщик НЕ добавляет ссылки на 4.0 Framework в переменные окружения вашей системы PATH.

Добавьте в переменную окружения PATH следующее:

c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319;c:\WINDOWS\Microsoft.NET\Framework\v3.5

Это работало для меня как во время установки, так и во время выполнения.

0 голосов
/ 21 октября 2011

Я нашел еще одну причину этой проблемы: если у вас есть несколько .NET Framework, установленных в вашем веб-сервисе, по умолчанию installutil.exe будет использовать самую старую версию.Это может вызвать проблемы, если устанавливаемая вами служба зависит от более новой версии платформы.

...