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





Самое простое - это попробовать. (У меня нет машин, отличных от 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 может потребоваться типы.
[MethodImpl (MethodImplOptions.NoInlining)] должен быть здесь на MainCore, не так ли?
@ Дэйв - вполне возможно; это было почти 2 года назад, поэтому моя память туманна, но то, что вы говорите, имеет смысл.
чувак, ты только что предложил решение того, над чем я работал все утро, ты сэкономил мне часы, когда я бился головой об стену. Благодарность!