В следния код искам да чета данни с помощта на 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
като върната стойност. Ще заменя това с обект от нов клас възможно най-скоро)