Как избежать исключения FileNotFoundException, если .NET 3.5 не установлен?

Если вы попытаетесь запустить приложение .NET 3.5 на компьютере с Windows, на котором не установлена ​​эта версия .NET framework, вы получите FileNotFoundException для некоторых системных сборок (например, System.Core 3.5.0.0).

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
4 344
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Самое простое - это попробовать. (У меня нет машин, отличных от 3.5, чтобы протестировать его, но я полагаю, что у вас есть.)

Сделайте вашу точку входа очень простой, которая просто пытается загрузить System.Core.dll и соответствующим образом обрабатывает исключение. Если он прошел, перейдите к другому классу, который затем сможет его использовать. Если это не удается, выведите соответствующее сообщение об ошибке и выйдите.

I подозревать вам не нужен такой уровень изоляции - пока у вас нет полей недоступных типов, я бы не ожидал, что сборка будет разрешена, пока вы сначала не вызовете метод, который в ней нуждается. . Мне нужно было бы проконсультироваться с CLR через C#, чтобы проверить. Тем не менее, держать его в полной изоляции, вероятно, будет безопаснее - это позволит избежать случайного введения зависимостей позже. Черт возьми, у вас даже может быть ваш тип «boot and check» в отдельной сборке, которая ничего не делает, кроме запуска другой, если все в порядке.

Да, вы можете поймать это исключение.

В своей основной программе просто используйте try..catch вокруг основного цикла сообщений.

try
{
   Application.Run(new MainForm());
}
catch (Exception ex)
{ 
    if (ex.MessageContains("Could not load file or assembly 'System.Core, Version=3.5.0.0"))
    {
        MessageBox.Show("This product requires the Microsoft .NET Framework version 3.5, or greater, in order to run.\n\nPlease contact your System Administrator for more information.");
    }
}
Ответ принят как подходящий

Как вы сейчас развертываете приложение? ClickOnce может выполнять проверки сборки (GAC) перед запуском, а с msi у вас должен быть целый ряд доступных параметров предварительной проверки ... хотя это не всегда возможно, вы можете рассмотреть один из этих вариантов развертывания?

Повторный перехват исключения - просто не забудьте разделить Main так, чтобы он выполнял ничего такого, за исключением перехвата исключения - иначе JIT может остановить загрузку Main:

// [STAThread] here if winform
[MethodImpl(MethodImplOptions.NoInlining)]
static void Main() {
    try {
       MainCore();
    } catch (SomeException ex) {
       // TODO something simple but fun
    }
}

static void MainCore() { ... } // your app here...

Если вы поместите слишком много во внешний Main, он может заблокировать его перед запуском Любые, поскольку JIT может потребоваться типы.

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

Epaga 02.03.2010 16:15

[MethodImpl (MethodImplOptions.NoInlining)] должен быть здесь на MainCore, не так ли?

Dave Cluderay 11.08.2010 21:04

@ Дэйв - вполне возможно; это было почти 2 года назад, поэтому моя память туманна, но то, что вы говорите, имеет смысл.

Marc Gravell 11.08.2010 22:45

Другие вопросы по теме