Я озадачен случаем AccessViolationException. Возможно, что это возможно (см. Ответ), чтобы иметь чистое воспроизведение, но здесь идет общая идея:
class MyClass
{
public List<SomeType> MyMethod(List<string> arg)
{
// BREAKPOINT here
// Simple stuff here, nothing fancy, no external libs used
}
}
delegate List<SomeType> MyDelegate(List<string> arg);
...
var myObject = new MyClass();
Func<List<string>, List<SomeType>> myFunc = myObject.MyMethod;
MyDelegate myDelegate = myObject.MyMethod;
myFunc(null) // works fine
myDelegate(null) // works fine
myObject.MyMethod(null) // throws AccessViolationException
Странная часть - я не использую какой-либо небезопасный код. У меня нет каких-либо зависимостей от внешних библиотек в любом месте (и в любом месте всего выполнения программы AFAIK).
Самая странная часть - это 100% воспроизводимость и даже после небольшого пересмотра кода, перемещение вызова метода в другом месте, добавление дополнительного кода перед ним и т.д. - во всех случаях AccessViolationException все равно бросается на этот конкретный вызов метода. Метод никогда не вводится при непосредственном вызове (точка останова не попадает). Вызов его через делегат или Func < > работает нормально.
Любые подсказки относительно того, что может вызвать это или как его отладить?
UPDATE
Следующий вопрос antiduh: нет вызова виртуального метода от конструктора где-нибудь рядом. Фактическая трассировка стека при этом очень проста, всего два статических метода и простой экземпляр.
Единственный ключ, кажется, threading. Параллельно .ForEach() и Thread.Sleep() вызывается перед этим при выполнении программы (не в стеке вызовов). Любые подсказки относительно того, как неправильно обработанные потоки (с обычными, управляемыми классами) могут вызвать AVE?
UPDATE
Сузить его до ошибки VS, см. мой ответ.