Хорошо, я допускаю его, этот код будет просто выглядеть странным Вам, и поэтому это странно. Это - просто код для репродуцирования поведения, для не кодирования я хочу использовать.
class Program
{
static void Main(string[] args)
{
try
{
Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero });
}
catch
{
Console.WriteLine("This won't print!");
}
Console.Write("Actually this will not print either!");
Console.ReadLine();
}
}
Какой тип исключительной ситуации я пытаюсь поймать (фактическим выданным исключением является ArgumentException насколько я могу сказать), код в блоке выгоды не выполнится. На самом деле выполнение просто остановится в Активаторе. CreateInstance-строка.
Вы взорвали CLR этим кодом. Впечатляющий. Фактическая ошибка - это повреждение кучи со сборкой мусора, о чем сигнализирует исключение ExecutionEngineException. Очевидно, ущерб достаточно велик, чтобы среда CLR не могла выполнить обработчик исключений.
Вы можете сообщить об этом на сайте connect.microsoft.com. Однако ошибка исправлена в .NET 4.0, она генерирует правильное исключение, ArgumentNullException, «Значение не может быть нулевым, Имя параметра: метод». Обходной путь очевиден: не передавайте IntPtr.Zero, если он ожидает ненулевую строку.
Когда я запускаю этот код в .NET 3.5, я получаю исключение ExecutionEngineException
. Когда среда выполнения выдает это исключение, это похоже на вызов Environment.FailFast
. Видимо это симптом повреждения памяти в куче.
Когда я переключаю ваш пример кода на следующий, достигается правильное поведение.
Activator.CreateInstance(
typeof(Func<int>),
new object[] { IntPtr.Zero, new object() }
);
Я прекрасно понимаю, что это вызывает больше вопросов, чем ответов ... :)