В следующем коде я хочу прочитать данные с помощью 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
в качестве возвращаемого значения. Я заменю его объектом нового класса как можно скорее)