Почему исключение не выдается, когда правильная версия платформы.NET не присутствует?

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

Мы заметили, что, если рабочая станция получает доступ к общему диску и запускает программу, но не имеет.NET 3,5 установленными, ничего не происходит, никакая ошибка, никакое исключение, никакая запись в журнале, это просто не запускается.

  • Почему не там никакое сообщение об ошибке, показанное в окнах CLR?

  • Есть ли что-то, что я могу поместить в начале кода, который гарантировал бы, что надлежащее сообщение об ошибке отображено?

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

Спасибо.


Идеально, у нас не должно было бы быть обертки для запросов для версии.NET, кажется, что программе не удается запуститься, и окна должны сообщать об этом где-нибудь. Я не могу полагать, что это просто тихо перестало бы работать.

6
задан Nate Heinrich 27 April 2010 в 21:29
поделиться

6 ответов

Попробуйте что-нибудь вроде этого 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   
---------------------------
10
ответ дан 8 December 2019 в 18:34
поделиться

Думаю, вы можете создать приложение на C ++, которое будет проверять, установлен ли необходимый .NET. Если нет, отобразите свое окно сообщений, и если оно установлено, приложение запустит нужную вам программу с общего диска.

1
ответ дан 8 December 2019 в 18:34
поделиться

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

Поскольку на этих машинах нет версии 3.5, можно быть уверенным, что у них нет 3.5 SP1. Таким образом, ваше приложение не сможет делать такие вещи, как открытие файлов или P / Invoke для неуправляемого кода. Если он попытается, вы получите исключения безопасности.

  • Что произойдет, если вы скопируете EXE-файл на локальный жесткий диск на этих машинах и запустите его оттуда?
  • Что произойдет, если ваше приложение получит исключения безопасности при запуске? Ваш собственный код каким-то образом маскирует исключение?
1
ответ дан 8 December 2019 в 18:34
поделиться

Чтобы конкретно ответить на ваши вопросы:

  • Нет. Задайте себе вопрос: если требуемый уровень среды отсутствует, в какой версии среды CLR следует разрешить (или заставить ее) отображать сообщение об ошибке?

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

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

0
ответ дан 8 December 2019 в 18:34
поделиться

] Есть ли какие-либо записи в журналах событий, когда приложение не запускается? Трудно поверить, хотя я полагаю, что это не невозможно, что это произойдет совершенно незаметно. Возможно, ваше приложение действительно генерирует исключение до загрузки первой формы, молча проглотил его (пустой блок catch) и затем завершил работу, и все это без каких-либо журналов или сообщений об ошибках.

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

1
ответ дан 8 December 2019 в 18:34
поделиться

Вместо того, чтобы отправлять исполняемый файл напрямую, вы можете создать командный файл, который сначала проверяет правильность установлена ​​версия .NET (см. ссылку ниже) и либо запустите приложение и закройте окно консоли, либо отобразите сообщение об ошибке и Пауза.

Есть ли в командной строке команда для проверки того, какая версия .NET установлена ​​

0
ответ дан 8 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: