Как изящно потерпеть неудачу, если .NET не установлен?

Недавно я спросил если вы можете определить из приложения, установлен ли .NET (чтобы приложение не рухнуло с общей ошибкой-исключением).

Ответ кажется простым «нет». Я все еще хочу иметь возможность изящно выйти, если .NET не установлен, есть ли способ сделать это?

Имейте в виду, что я не хочу менять имя исполняемого файла, что означает, что это нормально, когда неуправляемый исполняемый файл выполняет проверку, а dll выполняет настоящую программу .NET, но не имеет исполняемых файлов.

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


person Jorge Córdoba    schedule 27.02.2009    source источник
comment
Почему бы не использовать установщик? Тогда эта проблема уходит.   -  person Gary Willoughby    schedule 27.02.2009


Ответы (4)


У вас есть два разных варианта:

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

OR

  • Убедитесь, что ваш установщик устанавливает среду выполнения. Джо Коехорн упомянул, что это было бы легко сделать с помощью MSI в этом сообщении и вы также должны быть в состоянии сделать это с другими установщиками, такими как InnoSetup. Конечно, если кто-то сначала установит ваше программное обеспечение, затем переустановит Windows, а затем попытается запустить ваше приложение, не переустанавливая его, произойдет сбой.

И, конечно же, вы можете комбинировать и то, и другое, чтобы получить лучшее из обоих миров.

person Adrian Grigore    schedule 27.02.2009

Вы можете написать собственное приложение, которое будет проверять существование .Net. Затем вам нужно будет загрузить управляемую dll с помощью LoadLibrary и вызвать внутри нее функцию (GetProcAddress), которая запустит ваше приложение .Net.

Я думаю, вам также нужно будет возиться с .Net dll, чтобы сделать вашу основную функцию видимой и вызываемой из неуправляемого кода. Это называется обратным PInvoke.

http://www.autohotkey.com/forum/topic20273.html

person Alex Reitbort    schedule 27.02.2009

Что вы можете сделать, так это написать свой код обнаружения .NET в родном Win32 C/C++, он выполняет обнаружение, отображает какое-то удобное для пользователя сообщение об ошибке или что-то еще, что вы подразумеваете под изящным падением, или вызывает .NET dll, если есть соответствующая доступная структура. Если вы не хотите иметь два исполняемых файла, просто сохраните байты dll в своем собственном исполняемом файле и загрузите его динамически.

Обратите внимание, что этот подход делает полностью невозможным запуск вашего приложения с Mono.

person Tamas Czinege    schedule 27.02.2009
comment
Почему это делает невозможным запуск приложения с Mono? Разве он не мог написать собственные загрузчики кода для других платформ и Mono? - person Adrian Grigore; 27.02.2009

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

person Gary Willoughby    schedule 27.02.2009
comment
Да, но как мне это сделать БЕЗ .NET framework в первую очередь? - person Jorge Córdoba; 27.02.2009
comment
Если вы создадите установщик с помощью VS200*, он сделает это за вас. - person Gary Willoughby; 27.02.2009