Почему я не могу установить свою службу (среда выполнения новее, чем загруженная среда выполнения)?

Итак, я создал службу на C # и пытаюсь установить ее с помощью следующей команды:

C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\installutil.exe MyService.exe >> installLog.txt

Это не удается. Когда я смотрю на installLog.txt, я получаю следующее:

Microsoft (R) .NET Framework Installation utility Version 2.0.50727.3053
Copyright (c) Microsoft Corporation.  All rights reserved.

Exception occurred while initializing the installation:
System.BadImageFormatException: Could not load file or assembly 'file:///C:\MyService.exe' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded..

Тот же подход отлично подходит для установки другой сборки. Я чувствую, что это может быть потому, что тот, который не работает, был написан для .NET 4.0, а тот, который работает, - для 3.5.

Есть ли у кого-нибудь опыт работы с этой проблемой?


person SuperNES    schedule 18.11.2010    source источник
comment
Вам нужно будет развернуть .net 4 на сервере, если вы создали установку в .net 4.0.   -  person Kell    schedule 18.11.2010
comment
Но я могу построить сам проект в Visual Studio. Разве это не означает, что .NET 4.0 уже установлен?   -  person SuperNES    schedule 18.11.2010
comment
Только пробовал установить - уже установлено.   -  person SuperNES    schedule 18.11.2010
comment
Это не проблема 32/64 бит, не так ли?   -  person Iain Ward    schedule 18.11.2010
comment
я пробовал 32 и 64 битные версии installutil; ни один не работает.   -  person SuperNES    schedule 18.11.2010


Ответы (11)


Вы используете неправильный installutil.exe. Если ваше приложение построено на .Net 4.0. Используйте installutil.exe в папке 4.0.

Для x86:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ installutil.exe

Для x64:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ installutil.exe

person Darryl Braaten    schedule 18.11.2010
comment
как мне сделать это по умолчанию installutil.exe? - person Louis Rhys; 30.05.2011
comment
@louisrhys добавьте к своему пути каталог фреймворка 4.0. Вы можете изменить свой системный путь, чтобы он был для всех приглашений cmd или vcvarsall.bat, если вы просто хотите изменить его для командной строки Visual Studio. - person Darryl Braaten; 30.05.2011
comment
@DarrylBraaten ... это РЕШЕНИЕ :) - person Umer; 01.02.2012
comment
Будьте осторожны с этим, так как вы должны убедиться, что вы ориентируетесь либо на x86, либо на x64 - в этом случае ...\Framework64\... НЕ является правильным путем. Для x86 вы будете использовать вместо этого: C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe. Если вы попытаетесь использовать неправильную архитектуру для своей сборки, вы также получите эту ошибку, даже если версия фреймворка кажется правильной. - person jocull; 07.03.2014

Никто и близко не подошел к этому!

Вот что мне пришлось сделать:

  1. Щелкните правой кнопкой мыши проект службы в Visual Studio и выберите «Свойства».
  2. В поле «Объект запуска» укажите имя службы (было установлено значение «(Не задано)»).
  3. Сохранить.
  4. Строить
  5. Попробуй установить еще раз.
  6. Оно работает! Ура! Мы все можем вернуться домой!

Ссылка на статью о проекте кода, которая помогла:

person SuperNES    schedule 18.11.2010
comment
У меня была такая же проблема при обновлении с .NET 2.0 до 4.0. В дополнение к отсутствию объекта Startup, в проекте установки и развертывания в качестве обязательного условия использовалась ссылка на .NET 2.0. Мне нужно было обновить ссылку на .Net 4.0 и обновить мой загрузчик .NET Framework до 4.0 в диалоговом окне предварительных требований. - person xr280xr; 05.04.2011
comment
Никогда не разбираюсь в технологии MS :-(. У меня сработало, спасибо. - person greenoldman; 16.03.2012
comment
Еще один совет в дополнение к xr280xr: если ваша Visual Studio работает на XP (x86) и вы создаете пакет установщика для Windows 7x64, содержащий 32-битный код, при компиляции вы получите предупреждение о том, что версия фреймворка не соответствует - вы можете игнорировать это сообщение. Настройте установщик для процессора x64, но нацелите проекты (ваш код) на процессор x86 или любой процессор (если у вас нет 32-битных сторонних DLL), чтобы он работал правильно в Windows 7x64. У меня это сработало только так ... - person Matt; 05.10.2012


Что касается меня, я просто щелкнул правой кнопкой мыши по исполняемому файлу, который пытался установить, и нажал «Разблокировать».

person user3447136    schedule 21.09.2016

Если вы компилируете на машине x64, обязательно зайдите в Configuration Mgr и измените сборку на x64. Конечно, вы захотите убедиться, что используете правильную версию InstallUtil.exe. удача.

person oj_n    schedule 18.11.2011
comment
Моя проблема заключалась в том, что он был скомпилирован для x64, но я использовал installutil x86. это был хороший совет - person Justin; 19.09.2017

Я считаю, что вы даете ответ на свой вопрос:

«Эта сборка создана средой выполнения более новой, чем текущая загруженная среда выполнения, и не может быть загружена ..»

Таким образом, вы могли скомпилировать среду выполнения с более новыми функциями (которые находятся в более новых фреймворках), но компьютер, на котором вы ее регистрируете, работает с более низкой версией.

Например. компилировать для .NET 3.5, но потом устанавливать службу на .NET 2.0 не имеет смысла.

Поскольку вы можете устанавливать службы на целевом компьютере, я думаю, вы уже являетесь администратором. Так что просто обновите платформу .NET на этой служебной машине.

person BerggreenDK    schedule 18.11.2010
comment
оххх еще кто-то тоже прокомментировал. не знал - person BerggreenDK; 18.11.2010
comment
Это проект .NET 4.0, и на машине установлена ​​.NET 4.0. Я пытаюсь установить на той же машине, на которой кодировал - я бы подумал, что если бы это было проблемой, она бы возникла раньше. - person SuperNES; 18.11.2010
comment
Но вы пользуетесь сервисом установки 2.0? \ Framework64 \ v2.0.50727 \ installutil.exe - person BerggreenDK; 18.11.2010
comment
Я использую этот: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ installutil.exe - person BerggreenDK; 18.11.2010
comment
У меня такая же проблема. Я обновил свое решение с .NET 2.0 до 4.0, и теперь установщик (из проекта установки и развертывания) выдает мне эту ошибку. Возможно, в проекте установки и развертывания используется неправильная версия installutil.exe? - person xr280xr; 05.04.2011
comment
Это было не так, см. Мой комментарий под ответом выше. - person xr280xr; 05.04.2011

Вы пробовали просто ввести MyService.exe /install в окне командной строки в каталоге, содержащем вашу службу Windows? Это работало для меня в прошлом. Вы также можете удалить службу Windows с помощью MyService.exe /uninstall.

person Bernard    schedule 18.11.2010
comment
Обычно это не работает для служб .NET, если автор вручную не добавил код для обработки файла / install. Эти параметры раньше были частью автоматически сгенерированного кода для старых сервисов C ++, поэтому раньше были обычным явлением - теперь это не так. - person O'Rooney; 30.10.2014
comment
@ О'Руни: Скорее всего, ты прав. Более старые службы Windows с большей вероятностью будут работать таким образом. - person Bernard; 30.10.2014

У меня такая же проблема. Изначально мой проект находился на очень длинном пути на D: \ внутри папки отладки моего проекта. Проблема была решена, когда я переместил служебный файл .exe в другое место с более коротким путем и начал с "C: \".

Я также использую этот командный файл для установки моих сервисов.

@ECHO OFF

REM Directory for .NET 4. Check for other version directories.
set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
set PATH=%PATH%;%DOTNETFX2%

echo Installing MyService...
echo ---------------------------------------------------
InstallUtil /i C:\ServiceFolder\MyService.exe
echo ---------------------------------------------------
echo Done.
pause
person Alejandro del Río    schedule 01.09.2015
comment
Я подозреваю, что это была не длина пути и не диск, на котором он находился, а что-то вроде пробелов в имени папки, которые вы могли бы заставить работать, заключив путь к служебному файлу в двойные кавычки. - person Evgeniy Berezovsky; 10.04.2017

Если вы попробовали все вышеперечисленное и по-прежнему видите ту же ошибку, дважды проверьте, есть ли у вас 32-разрядное приложение или какие-либо 32-разрядные библиотеки DLL, и ваш сервер является 64-разрядным.

person JIANG    schedule 11.07.2017

Имея такую ​​же проблему, ничего из вышеперечисленного не помогало на Windows Server 2019

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

person Kjeld Poulsen    schedule 19.03.2020

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

Шаг 1) cd C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

добавьте каталог пути .exe в кавычки, как показано

шаг 2) InstallUtil.exe E: \ MyNewService \ MyNewService \ bin \ Debug \ MyNewService.exe

ref: https://www.codeproject.com/Answers/5143174/Installing-windows-service-error-installutil-exe-i#answer5

person shyam    schedule 16.07.2020