У нас есть приложение.NET, которое предназначается для.NET 3.5. Наши клиенты выполняют его от общего диска (очень нечасто), чтобы иметь центральное расположение файла конфигурации.
Мы заметили, что, если рабочая станция получает доступ к общему диску и запускает программу, но не имеет.NET 3,5 установленными, ничего не происходит, никакая ошибка, никакое исключение, никакая запись в журнале, это просто не запускается.
Почему не там никакое сообщение об ошибке, показанное в окнах CLR?
Есть ли что-то, что я могу поместить в начале кода, который гарантировал бы, что надлежащее сообщение об ошибке отображено?
Это не опция запустить установщик, который проверил бы на prereqs, поскольку мы только устанавливаем его в одной центральной части.
Спасибо.
Идеально, у нас не должно было бы быть обертки для запросов для версии.NET, кажется, что программе не удается запуститься, и окна должны сообщать об этом где-нибудь. Я не могу полагать, что это просто тихо перестало бы работать.
Попробуйте что-нибудь вроде этого app.config;
<configuration>
<startup>
<supportedRuntime version="v3.5" />
</startup>
</configuration>
Я получаю приятное маленькое диалоговое окно, вроде этого;
--------------------------- moreverfoo.exe - .NET Framework Initialization Error --------------------------- To run this application, you first must install one of the following versions of the .NET Framework: v3.5 Contact your application publisher for instructions about obtaining the appropriate version of the .NET Framework. --------------------------- OK ---------------------------
Думаю, вы можете создать приложение на C ++, которое будет проверять, установлен ли необходимый .NET. Если нет, отобразите свое окно сообщений, и если оно установлено, приложение запустит нужную вам программу с общего диска.
Если на компьютере установлен .NET 3.5 SP1 (как, вероятно, на вашей машине разработки), то вы можете запустить приложение .NET из общего сетевого ресурса, и оно будет работать нормально, с полным доверием. Но это новинка в 3.5 SP1 - это даже не было правдой в исходной версии 3.5. До версии 3.5 SP1, если вы попытаетесь запустить приложение из общего сетевого ресурса, оно будет работать с ограниченными разрешениями.
Поскольку на этих машинах нет версии 3.5, можно быть уверенным, что у них нет 3.5 SP1. Таким образом, ваше приложение не сможет делать такие вещи, как открытие файлов или P / Invoke для неуправляемого кода. Если он попытается, вы получите исключения безопасности.
Чтобы конкретно ответить на ваши вопросы:
Нет. Задайте себе вопрос: если требуемый уровень среды отсутствует, в какой версии среды CLR следует разрешить (или заставить ее) отображать сообщение об ошибке?
Также нет. Нет неуправляемого фрагмента кода / заглушки, который запускается в начале вашего приложения до того, как оно станет управляемым, поэтому нет возможности упреждающе проверить правильность версии платформы.
Таким образом, загрузчик или оболочка - ваш единственный вариант - или вы можете взглянуть на приложение типа «щелчок один раз» и посмотреть, сможете ли вы с его помощью обеспечить соблюдение предварительных условий (правильной структуры).
] Есть ли какие-либо записи в журналах событий, когда приложение не запускается? Трудно поверить, хотя я полагаю, что это не невозможно, что это произойдет совершенно незаметно. Возможно, ваше приложение действительно генерирует исключение до загрузки первой формы, молча проглотил его (пустой блок catch) и затем завершил работу, и все это без каких-либо журналов или сообщений об ошибках.
Кроме того, обычно вы не можете запускать приложения .NET через общий сетевой ресурс, потому что это «ненадежное место», а я в прошлом всегда возникали исключения безопасности.
Вместо того, чтобы отправлять исполняемый файл напрямую, вы можете создать командный файл, который сначала проверяет правильность установлена версия .NET (см. ссылку ниже) и либо запустите приложение и закройте окно консоли, либо отобразите сообщение об ошибке и Пауза.
Есть ли в командной строке команда для проверки того, какая версия .NET установлена