Блок catch С# не выполняется, когда выдается AccessViolationException

В следующем коде я хочу прочитать данные с помощью Marshal. Сама функция работает нормально (конечно, если длина соответствует указателю). Я написал модульный тест, чтобы проверить некоторые возможные результаты copyDataFromMemory, и заметил, что AccessViolationException выбрасывается, но мой тест тут же останавливается и не выполняет мой блок catch. Вот мой код:

private static double[] copyDataFromMemory(PointerLengthPair pointerLengthPair)
{
     double[] dataChain = new double[pointerLengthPair.Length];
     try
     {
         Marshal.Copy(pointerLengthPair.Pointer, dataChain, 0, pointerLengthPair.Length);
     }
     catch (AccessViolationException)
     {        
         return null;
     }
     catch (Exception)
     {
         return null;
     }

     return dataChain;
}

public class PointerLengthPair
{
    public IntPtr Pointer { get; private set; }
    public int Length { get; private set;}

    public PointerLengthPair(IntPtr pointer, int length)
    {
        Pointer = pointer;
        Length = length;
    }
}

Теперь мой вопрос: это какая-то проблема с Visual Studio 2012? Есть ли настройки, которые я должен выбрать, или просто невозможно поймать AccessViolationException? Или я упускаю что-то очевидное?

(примечание: не обращайте внимания на то, что в настоящее время я использую null в качестве возвращаемого значения. Я заменю его объектом нового класса как можно скорее)


person Mickey    schedule 07.07.2014    source источник
comment
Вам следует попробовать прочитать документацию для AccessViolationException: начиная с .NET Framework 4, исключения AccessViolationException, создаваемые средой CLR, не обрабатываются оператором catch в структурированном обработчике исключений, если исключение возникает за пределами памяти, зарезервированной для CLR. время выполнения. [...]   -  person Jon    schedule 07.07.2014
comment
Спасибо. Кажется, я пропустил эту часть.   -  person Mickey    schedule 07.07.2014